Câu hỏi Serialize List (nơi các đối tượng được hỗ trợ nguyên thủy) trong Protobuf.NET?

Làm thế nào để tôi serialize một đối tượng như thế này với protobuf-net:

public class MyObject{
   public string Key {get; set;}
   public List<Object> Values {get; set;}
}

Khi tôi cố gắng serialize này với một protobuf TypeModel-net ném một lỗi nói rằng nó không biết làm thế nào để serialize System.Object. Bây giờ tôi biết rằng các giá trị sẽ chỉ bao giờ chứa các nguyên thủy (int, string, float, DateTime, vv). Vì vậy, làm thế nào để tôi protobuf-net biết về điều này?


12
2017-09-21 22:24


gốc


DateTime không phải là nguyên thủy. - Henk Holterman
Đó là, tuy nhiên, serializable. - cHao
Tôi không biết protobuf nhưng bạn đang yêu cầu rất nhiều từ một serializer. - Henk Holterman
.NET DataContract serializes nó chỉ tốt .... Và có, DateTime có một loại kỳ lạ bán nguyên thủy trạng thái trong .NET. Ví dụ, int? hợp lệ và MyObject? là không, bởi vì MyObject không phải là một nguyên thủy, tuy nhiên DateTime? hoàn toàn hợp lệ. Vì vậy, không, có lẽ không phải là một nguyên thủy, nhưng nó là một loại giá trị, và nó được xây dựng trong, và serializable. - Timothy Baldridge
Tôi nghĩ rằng nó thực sự có thể là một vấn đề cơ bản hơn: trừ khi tôi bị nhầm lẫn, bộ đệm giao thức chỉ hỗ trợ danh sách đồng nhất ..?


Các câu trả lời:


Điều này không thực sự khả thi trong ProtoBuf thuần túy, theo bất kỳ nghĩa nào. ProtoBuf được gõ mạnh mẽ, nhưng không chứa thông tin kiểu trong tin nhắn; loại thông tin luôn được chỉ định bên ngoài. Do đó có hai giải pháp "tốt"; Tức là, các giải pháp mà sẽ dễ dàng để giải thích bởi một protobuf thực hiện khác hơn Protobuf-net (Mà bạn có thể hoặc có thể không quan tâm, nhưng marc chắc chắn dường như).

1: Thay thế List<object> với List<PrimitiveType> Ở đâu PrimitiveType chứa các trường tùy chọn tương ứng với tất cả các kiểu nguyên thủy 12 hoặc (tùy thuộc vào định nghĩa của bạn về "Kiểu nguyên thủy"). Và bạn chỉ đảm bảo một trong các trường đó được điền vào mỗi trường hợp.

2: Thay thế List<object> với sự kết hợp của List<int>, List<double>, List<string> v.v.


9
2017-09-23 14:53





Xem Trong Protobuf-net làm thế nào tôi có thể vượt qua một mảng của đối tượng kiểu với các đối tượng của các loại khác nhau bên trong, biết tập hợp các loại tiềm năng trước.

Theo Marc post (tác giả của Protobuf.NET) object là vấn đề. Mặc dù tôi không thể tìm thấy nó ngay bây giờ, tôi nhớ rõ ràng khi nhìn thấy một tấm séc object trong nguồn để ném một ngoại lệ đối với các nỗ lực để sắp xếp các thuộc tính đối tượng nối tiếp trực tiếp.

Để giải quyết vấn đề này, bạn nên sử dụng một lớp cụ thể hơn để được tuần tự hóa và không sử dụng object trực tiếp. Bạn có thể dùng IProtoSerializer để thực hiện tuần tự hóa / deserialisation tùy chỉnh. Protobuf cũng sẽ hỗ trợ ISerializable và IXmlSerializable giao diện nếu điều đó giúp.


0
2017-09-23 14:32



Để làm rõ: protobuf-net không tiêu thụ  ISerializable cũng không IXmlSerializable - thay vào đó nó có thể được sử dụng để triển khai thực hiện chúng. IProtoSerializer là một nội bộ lớp, và không thể được sử dụng trong sự cô lập. - Marc Gravell♦
@MarcGravell Cảm ơn bạn đã làm rõ. - Bernie White