1

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

1 回答 1

2

将,添加到基类:

[ProtoInclude(1, typeof(ClassB))]

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

请注意,1这里只是与其他键不冲突的任何键(最好是少量 - 它们编码更有效)ClassA(所以:我不能使用2,因为Ais 2in ClassA1)。键只需要在单个类中是唯一的(不同类之间不需要,即使在继承中也是如此)。

于 2013-08-02T09:38:40.547 回答