[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; }
}
Poi, nella configurazione del codice che ho un nuovo TypeModel e aggiungere le mie sottotipiPerché la mia lista <Foo> non viene serializzata con 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));
Ora, posso serializzare le istanze di Foo, Bar e Baz bene. Se serializzo
var listThatWorks = new List<Foo> { new Foo { FooId = 12 } }
var anotherListThatWorks = new List<Foo> { new Bar { FooId = 12, Name = "Test" } }
Che funziona bene. Tuttavia, se serializzare
var fails = new List<Foo> { new Baz { FooId = 12, Name = "Test" } }
allora ottengo un InvalidOperationException con il messaggio "Unexpected sottotipo: Baz". Che cosa sto facendo di sbagliato? È una cattiva idea usare sottotipi con protobuf-net?
Inoltre, grazie a @BFree per avermi aiutato a capire, questo è correlato ad avere due livelli di sottoclassi.
Domanda correlata: [sottotipo inaspettato protobuf.net] (http://stackoverflow.com/questions/3797651/protobuf-net-unexpected-subtype) –
@ M.Babcock - L'ho visto. Credo che la risposta più alta si riferisca a una vecchia versione di protobuf-net (potrebbe essere sbagliato). Quello e le risposte proposte non hanno funzionato. – AgileJon
Ho appena provato il tuo codice in una semplice app per console: http://pastie.org/3692350 e ha funzionato per me, senza eccezioni .... – BFree