[DataContract] public class Foo
{
[DataMember(Order = 1)] public int FooId { get; set; }
}
[DataContract] public class Bar : Foo
{
[DataMember(Order = 2)] public string Name { get; set; }
}
[DataContract] public class Baz : Bar
{
[DataMember(Order = 3)] public string BazName { get; set; }
}
Sau đó, trong đoạn code tôi thiết lập một TypeModel mới và thêm phân nhóm của tôiTại sao danh sách của tôi không được liệt kê <Foo> với protobuf-net?
_ProtobufSerializer = TypeModel.Create();
_ProtobufSerializer.Add(typeof(Bar), true);
_ProtobufSerializer.Add(typeof(Baz), true);
var type = _ProtobufSerializer.Add(typeof(Foo), true);
type.AddSubType(100, typeof(Bar));
type.AddSubType(101, typeof(Baz));
Bây giờ, tôi có thể serialize trường hợp của Foo, Bar và Baz tốt. Nếu tôi tuần tự hóa
var listThatWorks = new List<Foo> { new Foo { FooId = 12 } }
var anotherListThatWorks = new List<Foo> { new Bar { FooId = 12, Name = "Test" } }
Điều đó có hiệu quả. Tuy nhiên, nếu tôi tuần tự hóa
var fails = new List<Foo> { new Baz { FooId = 12, Name = "Test" } }
Sau đó, tôi nhận được một InvalidOperationException với thông báo "Loại phụ không mong muốn: Baz". Tôi đang làm gì sai? Nó chỉ là một ý tưởng tồi để sử dụng các loại phụ với protobuf-net?
Ngoài ra, nhờ @BFree giúp tôi tìm ra điều này có liên quan đến việc có hai cấp lớp con.
Câu hỏi liên quan: [protobuf.net Subtype không mong muốn] (http://stackoverflow.com/questions/3797651/protobuf-net-unexpected-subtype) –
@ M.Babcock - Tôi đã thấy điều đó. Tôi tin rằng phản ứng hàng đầu đã đề cập đến một phiên bản cũ của protobuf-net (có thể là sai). Điều đó và câu trả lời được đề xuất không hoạt động. – AgileJon
Tôi vừa thử mã của bạn trong một ứng dụng giao diện điều khiển đơn giản: http://pastie.org/3692350 và nó làm việc cho tôi, không có ngoại lệ .... – BFree