[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.
Powiązane pytanie: [protobuf.net Nieoczekiwany podtyp] (http://stackoverflow.com/questions/3797651/protobuf-net-unexpected-subtype) –
@ 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
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