Protobuff.NET - 抽象基类的不同序列化

时间:2013-08-01 15:28:23

标签: .net serialization protocol-buffers protobuf-net

我想通过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; }
    }
}

1 个答案:

答案 0 :(得分:2)

添加到基类:

[ProtoInclude(1, typeof(ClassB))]

基本上,与XmlSerializer一样(请参阅:[XmlInclude])和DataContractSerializer(请参阅:[KnownType]) - 序列化程序需要事先了解子类。最简单的方法是使用属性,但如果您愿意,也可以在运行时指定

注意1这里只是任何键(最好是一个小数字 - 它们编码效率更高),与ClassA中的其他键不冲突(所以:我无法使用{{ 1}}因为2中的A2。键只需要在单个类中是唯一的(不在不同类之间,甚至在继承中)。