2012-03-29 29 views
5
[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.

+0

Câu hỏi liên quan: [protobuf.net Subtype không mong muốn] (http://stackoverflow.com/questions/3797651/protobuf-net-unexpected-subtype) –

+0

@ 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

+2

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

Trả lời

4

OK. Thực sự, tôi nên cung cấp tín dụng cho BFree. Ông đặt cùng một ứng dụng mẫu runnable cho thấy bài viết gốc của tôi đã quá đơn giản. Vấn đề thực sự là mô hình đối tượng của tôi, nơi Baz là một phân lớp của Bar mà chính nó là một phân lớp của Foo. Khi tôi thiết lập TypeModel tôi đã không xác định chính xác cấu trúc này. Nên có được:

_ProtobufSerializer = TypeModel.Create(); 
_ProtobufSerializer.Add(typeof(Baz), true); 
var barType = _ProtobufSerializer.Add(typeof(Bar), true); 
var fooType = _ProtobufSerializer.Add(typeof(Foo), true); 
fooType.AddSubType(100, typeof(Bar)); 
barType .AddSubType(101, typeof(Baz)); 

Tôi thực sự không chắc về giá trị đơn đặt hàng, nhưng tôi biết những công việc đó.

+0

Chỉ cần trở lại để xem xét điều này - vui vì bạn đã sắp xếp nó. –

Các vấn đề liên quan