Como serializar a classe herdada com o ProtoBuf-Net
Me desculpe se isso é uma duplicata. Eu pesquisei em vários lugares por uma resposta que eu possa entender, incluindo:
ProtoBuf.net Propriedades de classe base não são incluídas ao serializar a classe derivada
Serialize classes herdadas usando protobuf-net
Minhas desculpas, mas eu realmente não entendi as respostas. Eu estou procurando um serializador binário mais compacto mais rápido e ProtoBuf parece que poderia ser a resposta. Eu preciso serializar um conjunto de classes que derivam de uma única classe base. Há um grande número deles, portanto, antes de se comprometer a editar o código da turma, executei um teste simples. Além disso, eu não quero modificar as classes de forma alguma que possam afetar a desserialização de arquivos persistentes gerados com o serializador binário NET.
Esta é a classe base:
[ProtoContract]
public class BaseClass
{
[ProtoMember(1)]
public string Name
{
get; set;
}
[ProtoMember(2)]
public int Age
{
get; set;
}
}
Esta é a classe derivada:
[ProtoContract]
public class SubClass1 : BaseClass
{
[ProtoMember(3)]
public string Town
{
get; set;
}
[ProtoMember(4)]
public Sex Sex
{
get; set;
}
}
Este é o código para serializar e desserializar (obtido diretamente do Guia de Introdução
var person = new SubClass1 { Age = 25, Name = "Fred", Town = "Denbigh", Sex = Sex.Female };
using (var file = File.Create(filename))
{
Serializer.Serialize(file, person);
}
e desserializar:
SubClass1 newPerson;
using (var file = File.OpenRead(filename))
{
newPerson = Serializer.Deserialize<SubClass1>(file);
}
MessageBox.Show(newPerson.Name +
" : " + newPerson.Town +
" : " + newPerson.Age.ToString() +
" : " + newPerson.Sex);
O resultado é ": Denbigh: 0: Female"
De alguma forma, os valores das propriedades da classe base não estão sendo serializados? Eu originalmente testei com os índices ProtoMember para a classe derivada como 1, 2. Eu meio que pensei que não funcionaria então fui para 3, 4. Parece não fazer diferença. Na minha paranoia eu executei o mesmo teste usando o serializador binário padrão da NET e obtive o resultado esperado: "Fred: Denbigh: 25: Female"
O que estou perdendo por favor?