Jak serializować dziedziczoną klasę za pomocą ProtoBuf-Net
Przepraszam, jeśli jest to duplikat. Szukałem odpowiedzi na kilka miejsc, które mógłbym zrozumieć, w tym:
Serializuj dziedziczone klasy za pomocą protobuf-net
Przepraszam, ale tak naprawdę nie rozumiałem odpowiedzi. Szukam szybszego, bardziej zwartego serializatora binarnego i wygląda na to, że ProtoBuf może być odpowiedzią. Muszę serializować zestaw klas, które pochodzą z jednej klasy bazowej. Jest ich wiele, więc przed przystąpieniem do edycji kodu klasy przeprowadziłem prosty test. Nie chcę też modyfikować klas w żaden sposób, który mógłby wpłynąć na deserializację starszych utrwalonych plików wygenerowanych za pomocą serializatora binarnego NET.
To jest klasa podstawowa:
[ProtoContract]
public class BaseClass
{
[ProtoMember(1)]
public string Name
{
get; set;
}
[ProtoMember(2)]
public int Age
{
get; set;
}
}
To jest klasa pochodna:
[ProtoContract]
public class SubClass1 : BaseClass
{
[ProtoMember(3)]
public string Town
{
get; set;
}
[ProtoMember(4)]
public Sex Sex
{
get; set;
}
}
Jest to kod do serializacji i deserializacji (pobrany bezpośrednio z przewodnika Wprowadzenie)
var person = new SubClass1 { Age = 25, Name = "Fred", Town = "Denbigh", Sex = Sex.Female };
using (var file = File.Create(filename))
{
Serializer.Serialize(file, person);
}
i deserializować:
SubClass1 newPerson;
using (var file = File.OpenRead(filename))
{
newPerson = Serializer.Deserialize<SubClass1>(file);
}
MessageBox.Show(newPerson.Name +
" : " + newPerson.Town +
" : " + newPerson.Age.ToString() +
" : " + newPerson.Sex);
Rezultatem jest „: Denbigh: 0: Female”
Jakoś wartości z właściwości klasy bazowej nie są serializowane? Początkowo przetestowałem go z indeksami ProtoMember dla klasy pochodnej jako 1, 2. Myślę, że nie zadziałało, więc poszło 3, 4. Wydaje się, że nie ma to znaczenia. W mojej paranoi przeprowadziłem ten sam test przy użyciu standardowego serializatora binarnego NET i uzyskałem oczekiwany wynik: „Fred: Denbigh: 25: Female”
Czego mi brakuje?