2012-03-29 7 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; } 
} 

Następnie w konfiguracji kodu I nowy TypeModel i dodać moje podtypyDlaczego moja lista <Foo> nie będzie serializować z 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)); 

Teraz mogę serializacji instancji Foo, bar i Baz grzywny. Jeśli serializuje

var listThatWorks = new List<Foo> { new Foo { FooId = 12 } } 
var anotherListThatWorks = new List<Foo> { new Bar { FooId = 12, Name = "Test" } } 

To działa dobrze. Jednak gdybym serializacji

var fails = new List<Foo> { new Baz { FooId = 12, Name = "Test" } } 

Potem dostać InvalidOperationException z komunikatem „Unexpected podtypu: Baz”. Co ja robię źle? Czy używanie podtypów z protobuf-net jest złym pomysłem?

Również dzięki @BFree za pomoc w ustaleniu, że jest to związane z posiadaniem dwóch poziomów podklas.

+0

Powiązane pytanie: [protobuf.net Nieoczekiwany podtyp] (http://stackoverflow.com/questions/3797651/protobuf-net-unexpected-subtype) –

+0

@ M.Babcock - Widziałem to. Wierzę, że najlepsza odpowiedź odnosiła się do starej wersji protobuf-net (może być źle). To i proponowane odpowiedzi nie zadziałały. – AgileJon

+2

Po prostu wypróbowałem twój kod w prostej aplikacji na konsolę: http://pastie.org/3692350 i zadziałało dla mnie, bez wyjątków .... – BFree

Odpowiedz

4

Rozumiem. Naprawdę, powinienem przyznać BFree. Przygotował próbną aplikację, która pokazała, że ​​mój pierwotny post był zbyt uproszczony. Prawdziwym problemem był mój model obiektowy, w którym Baz był podklasą Baru, który sam był podklasą Foo. Kiedy ustawiłem TypeModel, nie określiłem poprawnie tej struktury. Powinien być:

_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)); 

Nie jestem właściwie pewien wartości zamówienia, ale znam te prace.

+0

Właśnie wróciłem, żeby na to spojrzeć - cieszę się, że to posortowałem. –

Powiązane problemy