如果这是重复,我很抱歉。我在几个地方搜索了一些我可能理解的答案,包括:
ProtoBuf.net Base class properties is not included when serializing derived class
Serialize inherited classes using protobuf-net
我很抱歉,但我并不理解答案。我正在寻找一个更快,更紧凑的二进制序列化器,ProtoBuf看起来可能是答案。我需要序列化一组所有派生自一个基类的类。它们有很多,所以在提交编辑类代码之前,我运行了一个简单的测试。另外,我不想以任何可能影响反序列化使用NET二进制序列化程序生成的旧持久文件的方式修改类。
这是基类:
[ProtoContract]
public class BaseClass
{
[ProtoMember(1)]
public string Name
{
get; set;
}
[ProtoMember(2)]
public int Age
{
get; set;
}
}
这是派生类:
[ProtoContract]
public class SubClass1 : BaseClass
{
[ProtoMember(3)]
public string Town
{
get; set;
}
[ProtoMember(4)]
public Sex Sex
{
get; set;
}
}
这是序列化和反序列化的代码(直接取自“入门指南”
var person = new SubClass1 { Age = 25, Name = "Fred", Town = "Denbigh", Sex = Sex.Female };
using (var file = File.Create(filename))
{
Serializer.Serialize(file, person);
}
和反序列化:
SubClass1 newPerson;
using (var file = File.OpenRead(filename))
{
newPerson = Serializer.Deserialize<SubClass1>(file);
}
MessageBox.Show(newPerson.Name +
" : " + newPerson.Town +
" : " + newPerson.Age.ToString() +
" : " + newPerson.Sex);
结果是“:Denbigh:0:女性”
不知何故,基类属性的值没有被序列化?我最初用派生类的ProtoMember索引测试它为1,2。我觉得这样做不行,所以去了3,4。它似乎没有区别。在我的偏执狂中,我使用标准的.NET二进制序列化程序运行相同的测试,得到了预期的结果:“Fred:Denbigh:25:Female”
我错过了什么?
答案 0 :(得分:26)
您需要在基类上使用ProtoInclude
属性:
[ProtoContract]
[ProtoInclude(500, typeof(SubClass1 ))]
public class BaseClass
{
id arg(上例中为500)对于该类应该是唯一的。有关详细信息,请参阅this文章
答案 1 :(得分:1)
我知道它已经很老了,但可能对某人有所帮助。在某些情况下,您可以通过重新定义子类型中的基本属性来解决此问题:
[ProtoContract]
public class SubClass1 : BaseClass
{
[ProtoMember(1)]
public string BaseName
{
get{return base.Name;}
set{base.Name = value;}
}
...
[ProtoMember(3)]
public string Town
{
get; set;
}
[ProtoMember(4)]
public Sex Sex
{
get; set;
}
}