Protobuf继承层次结构

时间:2014-08-06 16:55:52

标签: inheritance protocol-buffers

我有一个基类定义为:

[ProtoInclude(100, "Module.v1.DataObject.B, Module.v1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")]
[ProtoInclude(101, "Module.v2.DataObject.B, Module.v2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")]    
public class A
    {
        [ProtoMember(1)]
        public string Name;
    }

派生类在2个不同的程序集中定义:

Module.v1有

[Serializable]
[ProtoContract]
public class B: A
{
        [ProtoMember(2)]
        public int Key;
}

Module.v2有

[Serializable]
[ProtoContract]
public class B: A
{
        [ProtoMember(2)]
        public int Key;
}

当我尝试序列化/反序列化其中一个时,例如。 Module.v2.DataObject.B,protobuf抛出异常 - “一个类型只能参与一个继承层次结构Module.v2.DataObject.B”

你能帮忙解决我在这里可能做错的事吗?

1 个答案:

答案 0 :(得分:0)

我不能责备;我有3个项目:

  • 试验台
  • 第一个模块
  • 第二个模块

两个模块都引用了测试装备,因为它定义了A。然后,两个模块的输出可作为测试装置位置的文件提供,以便加载。

我的测试台确实:

static void Main()
{
    var type = Type.GetType("Module.v1.DataObject.B, Module.v1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
    A a = (A)Activator.CreateInstance(type);
    var clone = Serializer.DeepClone(a);
    Console.WriteLine(clone.GetType().FullName);

    type = Type.GetType("Module.v2.DataObject.B, Module.v2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
    a = (A)Activator.CreateInstance(type);
    clone = Serializer.DeepClone(a);
    Console.WriteLine(clone.GetType().FullName);
}

工作正常,输出:

Module.v1.DataObject.B
Module.v2.DataObject.B