Es tut mir leid, wenn dies ein Duplikat ist. Ich habe für eine Antwort mehrere Orte gesucht, die ich verstehen kann, einschließlich:Wie vererbte Klasse mit ProtoBuf-Net serialisiert werden
ProtoBuf.net Base class properties is not included when serializing derived class
Serialize inherited classes using protobuf-net
Ich entschuldige mich, aber ich habe nicht wirklich verstehen, die Antworten. Ich bin auf der Suche nach einem schnelleren kompakteren binären Serialisierer und ProtoBuf sieht aus, als ob es die Antwort sein könnte. Ich muss eine Reihe von Klassen serialisieren, die alle von einer einzelnen Basisklasse abstammen. Es gibt eine große Anzahl von ihnen, also bevor ich mich verpflichte, den Klassencode zu bearbeiten, habe ich einen einfachen Test durchgeführt. Außerdem möchte ich die Klassen in keiner Weise ändern, die sich auf die Deserialisierung älterer persistierter Dateien auswirken könnte, die mit dem binären NET-Serialisierungsprogramm generiert werden.
Dies ist die Basisklasse:
[ProtoContract]
public class BaseClass
{
[ProtoMember(1)]
public string Name
{
get; set;
}
[ProtoMember(2)]
public int Age
{
get; set;
}
}
Dies ist die abgeleitete Klasse:
[ProtoContract]
public class SubClass1 : BaseClass
{
[ProtoMember(3)]
public string Town
{
get; set;
}
[ProtoMember(4)]
public Sex Sex
{
get; set;
}
}
Dies ist der Code zum Serialisieren und Deserialisieren (
direkt aus dem Handbuch Erste Schritte genommenvar person = new SubClass1 { Age = 25, Name = "Fred", Town = "Denbigh", Sex = Sex.Female };
using (var file = File.Create(filename))
{
Serializer.Serialize(file, person);
}
und deserialize:
SubClass1 newPerson;
using (var file = File.OpenRead(filename))
{
newPerson = Serializer.Deserialize<SubClass1>(file);
}
MessageBox.Show(newPerson.Name +
" : " + newPerson.Town +
" : " + newPerson.Age.ToString() +
" : " + newPerson.Sex);
Das Ergebnis ist „: Denbigh: 0: weiblich“
Irgendwie sind die Werte von den Basisklasseneigenschaften werden nicht serialisiert werden? Ich habe es ursprünglich mit den ProtoMember-Indizes für die abgeleitete Klasse als 1, 2 getestet. Ich dachte irgendwie, das würde nicht funktionieren, also ging es für 3, 4. Es scheint keinen Unterschied zu machen. In meiner Paranoia habe ich den gleichen Test mit dem Standard-NET-Binär-Serialisierer durchgeführt und habe das erwartete Ergebnis: "Fred: Denbigh: 25: Female"
Was vermisse ich bitte?
Vielen Dank - so einfach – ScruffyDuck
Tipparbeit spart mir, ta –
Verbindung gebrochen zu sein scheint ... – RenniePet