2011-06-25 4 views
5

Để tuần tự hóa một lớp với protobuf-net, bạn cần cung cấp thuộc tính lớp và thuộc tính [ProtoContract] và [ProtoMember (n)] - trong đó n là 1,2,3, .., vnTrong Protobuf-net, có thể tuần tự hóa các lớp không được trang trí không?

Appart từ nhân bản đến một hình ảnh phản chiếu của một lớp, có thể tuần tự hóa/deserialize một lớp chúng ta không có quyền kiểm soát?

Ví dụ:

sử dụng ProtoBuf;

  • Serializer.Serialize < Ngoại lệ > (OutputStream, ngoại lệ);

hoặc

  • Serializer.Serialize < tuple < dữ liệu, ngoại lệ > > (OutputStream, dataWithPossibleException);

NB. Dữ liệu có [ProtoContract]/[ProtoMember] và các dữ liệu khác thì không.

cách tiếp cận có thể:

  • Nó sẽ được tốt đẹp nếu chúng ta có "thuộc tính mở rộng" mà làm việc như phương pháp khuyến nông. [không thể]
  • sao chép lớp cục bộ và sau đó sao chép sang/từ đối tượng trước khi tuần tự hóa/deserializing [điều đó sẽ hoạt động, nhưng năng suất giảm xuống]
  • tạo tệp/định nghĩa proto bên ngoài cho lớp và lưu trữ tài nguyên? [Ai biết làm thế nào để đi về điều này?]

Trả lời

3

Có những lựa chọn trong v2 ở đây:

  • bạn có thể cấu hình một RuntimeTypeModel nói cho nó về các loại và các thành viên mà không cần bất kỳ thuộc tính
  • với nhiều loại mà lúng túng, một đại diện có thể được cung cấp để làm cho việc tuần tự hóa dễ dàng hơn (nó phải có toán tử chuyển đổi đến/từ kiểu gốc)
  • cho các API không gõ tĩnh, có một tùy chọn để bao gồm siêu dữ liệu loại

Bây giờ, tôi nghĩ rằng một số trong đó giải quyết một số điểm của bạn. Nếu bạn có thể xác định đầy đủ một kịch bản có vấn đề, tôi có thể cụ thể hơn (hoặc nghĩ ra các cách mới để tra tấn mã để làm cho nó hoạt động).

Nhưng để trả lời câu hỏi tiêu đề (không được trang trí): có, trong v2

+0

Cảm ơn bạn đã dự đoán nhu cầu này! Tôi đã lựa chọn thay thế cho bây giờ, trong đó tôi decompiled các lớp khung nhỏ và đặt chúng trong hội đồng của tôi. Chủ yếu là tôi cố gắng tuân thủ POCO, vì vậy một lần như thế này không phải là một vấn đề lớn. Tôi sẽ kiểm tra các tùy chọn phiên bản 2 mới. – sgtz

+0

@sgtz phương pháp SetSurrogate nên làm cho trực tiếp và thuận tiện hơn –

+0

btw: Tôi đã có phiên bản cũ hơn một chút của v2. Vì vậy, tôi nhấn cập nhật trên svn, và bây giờ tôi có thể Serialize/Deserialize >. Ngoài ra, tôi đã phải loại bỏ + readd các protobuf-net nhị phân. Không chắc nó là gì, nhưng bây giờ nó hoạt động tốt.Cảm ơn bạn đã thực hiện dự án này công khai ... và cũng nhờ có Google. Tôi nên đề cập rằng tại thời điểm này, tôi vẫn * sử dụng bản sao của Tuple của tôi, không phải là bản sao trong không gian tên System. – sgtz