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; } 
} 

Dann in Code, den ich Setup eine neue TypeModel und meine Subtypen Nun fügen SieWarum wird meine Liste <Foo> nicht serialisiert mit 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)); 

, kann ich Instanzen von Foo, Bar und Baz feinem serialisiert. Wenn ich serialisieren

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

Das funktioniert gut. Allerdings, wenn ich serialisiert

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

Dann bekomme ich eine InvalidOperationException mit der Meldung „Unexpected Untertyp: Baz“. Was mache ich falsch? Ist es nur eine schlechte Idee, Untertypen mit protobuf-net zu verwenden?

Auch dank @BFree für die hilft mir herauszufinden, dass dies mit zwei Ebenen von Unterklassen verbunden ist.

+0

In Verbindung stehende Frage: [protobuf.net Unerwarteter Subtyp] (http://stackoverflow.com/questions/3797651/protobuf-net-unexpected-subtype) –

+0

@ M.Babcock - Ich sah das. Ich glaube, die Top-Antwort bezog sich auf eine alte Version von Protobuf-Net (könnte falsch sein). Das und die vorgeschlagenen Antworten haben nicht funktioniert. – AgileJon

+2

Ich habe gerade Ihren Code in einer einfachen Konsole App versucht: http://pastie.org/3692350 und es funktionierte für mich, keine Ausnahmen .... – BFree

Antwort

4

Verstanden. Wirklich, ich sollte BFree Kredit geben. Er stellte eine ausführbare Beispiel-App zusammen, die mir zeigte, dass mein ursprünglicher Beitrag zu vereinfacht war. Das eigentliche Problem war mein Objektmodell, in dem Baz eine Unterklasse von Bar war, die selbst eine Unterklasse von Foo war. Wenn ich das TypeModel einrichtete, habe ich diese Struktur nicht korrekt angegeben. Sollte gewesen:

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

Ich bin eigentlich nicht sicher über die Ordnung Werte, aber ich kenne diese Arbeit.

+0

Ich bin gerade zurückgekommen, um mir das anzusehen - froh, dass du es sortiert hast. –