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

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.

+0

Domanda correlata: [sottotipo inaspettato protobuf.net] (http://stackoverflow.com/questions/3797651/protobuf-net-unexpected-subtype) –

+0

@ 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

+2

Ho appena provato il tuo codice in una semplice app per console: http://pastie.org/3692350 e ha funzionato per me, senza eccezioni .... – BFree

risposta

4

Capito. Davvero, dovrei dare credito a BFree. Ha messo insieme un'app di esempio eseguibile che mi ha mostrato che il mio post originale era troppo semplificato. Il vero problema era il mio modello a oggetti in cui Baz era una sottoclasse di Bar che era di per sé una sottoclasse di Foo. Quando ho configurato il TypeModel non ho specificato correttamente questa struttura. Avrebbe dovuto essere:

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

In realtà non sono sicuro dei valori dell'ordine, ma so che funzionano.

+0

Sono appena tornato per dare un'occhiata a questo: sono felice che tu abbia risolto il problema. –

Problemi correlati