2012-08-08 5 views
5

Ich benutze Protobuf.net, um einige Klassen zu serialisieren. Ich möchte in der Lage sein, die SuperHero-Klasse (unten) zu serialisieren, ohne [ProtoInclude] für die Basisklasse angeben zu müssen. Dies liegt daran, dass die abgeleiteten Klassen automatisch generiert werden, die Basisklasse jedoch nicht, sodass die Basisklasse ihre abgeleiteten Klassen nicht direkt kennt.Protobuf.net: Umgang mit Vererbung ohne [ProtoInclude]

[ProtoContract] 
    class Person 
    { 
     [ProtoMember(1)] 
     public int Id { get; set; } 
     [ProtoMember(2)] 
     public string Name { get; set; } 
    } 

    [ProtoContract] 
    class SuperHero : Person 
    { 
     [ProtoMember(3)] 
     public string Powers { get; set; } 
    } 

Ich verwende die neueste Version von protobuf.net.

Antwort

6

Zuerst ein Hinweis: Irgendwann muss Ihr Code über die Unterklasse wissen - vielleicht über die Konfiguration. Es ist wichtig, dass irgendwie Sie zuverlässig Zahlen für jeden Subtyp reproduzieren können. Das Inkrementieren eines Zählers, wenn Sie die Typen zur Laufzeit finden, ist nicht ausreichend, wenn Sie Daten auf einem Datenträger usw. speichern, da Sie die Typen möglicherweise nicht in der gleichen Reihenfolge finden, wenn sie das nächste Mal ausgeführt wird. Damit; Lassen Sie uns das über einen Mechanismus annehmen Sie eine einzigartige positive ganze Zahl, die Superheld als Unterklasse von Person darstellt:

int tag = 7; // why not 
Type subType = typeof(SuperHero); 

Dann sagen protobuf-net zu diesem Untertyp:

RuntimeTypeModel.Default.Add(typeof(Person), true).AddSubType(tag, subType); 

Dies ist äquivalent zu dem, was der Attributverarbeitungscode tut, wenn er [ProtoInclude(...)]

+1

sieht. Der "einige Mechanismus", den ich verwendete, war eine benutzerdefinierte Version des 'ProtoContractAttribute' zu ​​erstellen, so dass ich eine abgeleitete Klasse mit '[Pr otoContract (7)] ', die sich genauso verhalten würden wie die Basisklasse mit' [ProtoInclude (typeof (SuperHero), 7)] 'zu dekorieren. Die Tatsache, dass die Attribute "versiegelt" sind, ist jedoch bedauerlich. –

+0

Danke für die sehr schnelle Antwort! Das macht alles gut für mich. –