So serialisieren Sie geerbte Klassen mit ProtoBuf-Net

Es tut mir leid, wenn dies ein Duplikat ist. Ich habe an mehreren Stellen nach einer Antwort gesucht, die ich möglicherweise verstehe:

Die Eigenschaften der ProtoBuf.net-Basisklasse werden beim Serialisieren abgeleiteter Klassen nicht berücksichtigt

Serialisieren Sie geerbte Klassen mit protobuf-net

Ich entschuldige mich, habe die Antworten aber nicht wirklich verstanden. Ich bin auf der Suche nach einem schnelleren, kompakteren binären Serializer und ProtoBuf scheint die Antwort zu sein. Ich muss eine Reihe von Klassen serialisieren, die alle von einer einzelnen Basisklasse abgeleitet sind. Es gibt eine große Anzahl von ihnen. Bevor ich mich zur Bearbeitung des Klassencodes entschied, führte ich einen einfachen Test durch. 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-Serializer generiert wurden.

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 entnommen)

var person = new SubClass1 { Age = 25, Name = "Fred", Town = "Denbigh", Sex = Sex.Female };

            using (var file = File.Create(filename))
            {
                Serializer.Serialize(file, person);
            }

und de-serialisieren:

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: Female"

Irgendwie werden die Werte aus den Basisklasseneigenschaften nicht serialisiert? Ich habe es ursprünglich mit den ProtoMember-Indizes für die abgeleitete Klasse als 1, 2 getestet. Ich dachte, das würde nicht funktionieren, also ging ich zu 3, 4. Es scheint keinen Unterschied zu machen. In meiner Paranoia habe ich den gleichen Test mit dem Standard NET Binary Serializer durchgeführt und das erwartete Ergebnis erhalten: "Fred: Denbigh: 25: Female"

Was vermisse ich bitte?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage