如何使用ProtoBuf-Net序列化inheritance的类
如果这是重复,我很抱歉。 我搜索了几个地方寻找我可能理解的答案,包括:
ProtoBuf.net序列化派生类时不包括基类属性
使用protobuf-net序列化inheritance的类
我很抱歉,但我并不理解答案。 我正在寻找一个更快,更紧凑的二进制序列化器,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(file); } MessageBox.Show(newPerson.Name + " : " + newPerson.Town + " : " + newPerson.Age.ToString() + " : " + newPerson.Sex);
结果是“:Denbigh:0:女性”
不知何故,基类属性的值没有被序列化? 我最初用派生类的ProtoMember索引测试它为1,2。我觉得这样做不行,所以去了3,4。它似乎没有区别。 在我的偏执狂中,我使用标准的.NET二进制序列化器运行相同的测试并获得了预期的结果:“Fred:Denbigh:25:Female”
我错过了什么?
您需要在基类上使用ProtoInclude
属性:
[ProtoContract] [ProtoInclude(500, typeof(SubClass1 ))] public class BaseClass {
id arg(上例中为500)对于该类应该是唯一的。 有关更多信息,请参阅此文章
我知道它很老了,但可能对某人有所帮助。 在某些情况下,您可以通过重新定义子类型中的基本属性来解决此问题:
上述就是C#学习教程:如何使用ProtoBuf-Net序列化inheritance的类分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
[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; } }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1007559.html