如何使用ProtoBuf-Net序列化继承的类

Scr*_*uck 25 c# serialization protobuf-net

如果这是重复,我很抱歉.我在几个地方搜索了一些我可能理解的答案,包括:

ProtoBuf.net序列化派生类时不包括基类属性

使用protobuf-net序列化继承的类

我道歉但我并不真正理解答案.我正在寻找一个更快,更紧凑的二进制序列化器,ProtoBuf看起来可能是答案.我需要序列化一组所有派生自一个基类的类.它们有很多,所以在提交编辑类代码之前,我运行了一个简单的测试.此外,我不想以任何可能影响反序列化使用NET二进制序列化程序生成的旧持久文件的方式修改类.

这是基类:

[ProtoContract]
    public class BaseClass
    {
        [ProtoMember(1)]
        public string Name
        {
            get; set;
        }
        [ProtoMember(2)]
        public int Age
        {
            get; set;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是派生类:

[ProtoContract]
    public class SubClass1 : BaseClass
    {
        [ProtoMember(3)]
        public string Town
        {
            get; set;
        }

        [ProtoMember(4)]
        public Sex Sex
        {
            get; set;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是序列化和反序列化的代码(直接来自"入门指南"

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

            using (var file = File.Create(filename))
            {
                Serializer.Serialize(file, person);
            }
Run Code Online (Sandbox Code Playgroud)

和反序列化:

SubClass1 newPerson;
            using (var file = File.OpenRead(filename))
            {
                newPerson = Serializer.Deserialize<SubClass1>(file);
            }

            MessageBox.Show(newPerson.Name + 
                " : " + newPerson.Town + 
                " : " + newPerson.Age.ToString() + 
                " : " + newPerson.Sex);
Run Code Online (Sandbox Code Playgroud)

结果是":Denbigh:0:女性"

不知何故,基类属性的值没有被序列化?我最初用派生类的ProtoMember索引测试它为1,2.我觉得这样做不行,所以去了3,4.它似乎没有区别.在我的偏执狂中,我使用标准的.NET二进制序列化程序运行相同的测试,得到了预期的结果:"Fred:Denbigh:25:Female"

我错过了什么?

wal*_*wal 27

您需要ProtoInclude在基类上使用该属性:

[ProtoContract]
[ProtoInclude(500, typeof(SubClass1 ))]
public class BaseClass
{
Run Code Online (Sandbox Code Playgroud)

id arg(上例中为500)对于该类应该是唯一的.有关更多信息,请参阅文章

  • 这种设计似乎倒退了.如果我的另一个库中的基类没有(也不应该)知道我的应用程序中的类,该怎么办?您可以将标签号添加到子类中吗? (8认同)