我想通过protobuf.net序列化一个抽象示例的属性 你能解释一下我需要改变什么才能让这个简单的例子有效吗?
using System;
using System.IO;
using ProtoBuf;
namespace TestProtobuf
{
class Program
{
static void Main(string[] args)
{
var x = new ClassB {A = "AAAA", B = "BBBB"};
var memoryStream = new MemoryStream();
Serializer.Serialize(memoryStream,x);
var memoryStream2 = new MemoryStream(memoryStream.ToArray());
var y = Serializer.Deserialize<ClassB>(memoryStream2);
if (x.A != y.A)
Console.Write("Failed");
}
}
[ProtoContract]
public class ClassB:ClassA
{
[ProtoMember(1)]
public string B { get; set; }
}
[ProtoContract]
public abstract class ClassA
{
[ProtoMember(2)]
public string A { get; set; }
}
}
答案 0 :(得分:2)
添加到基类:
[ProtoInclude(1, typeof(ClassB))]
基本上,与XmlSerializer
一样(请参阅:[XmlInclude]
)和DataContractSerializer
(请参阅:[KnownType]
) - 序列化程序需要事先了解子类。最简单的方法是使用属性,但如果您愿意,也可以在运行时指定 。
注意1
这里只是任何键(最好是一个小数字 - 它们编码效率更高),与ClassA
中的其他键不冲突(所以:我无法使用{{ 1}}因为2
中的A
是2
。键只需要在单个类中是唯一的(不在不同类之间,甚至在继承中)。