【问题标题】:Protobuf Inheritance hierarchyProtobuf 继承层次结构
【发布时间】:2014-08-06 16:55:52
【问题描述】:

我有一个基类定义为:

[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"

您能帮我解决一下我在这里可能做错了什么吗?

【问题讨论】:

  • 有趣;我得看看
  • “无法复制”(完整设置请参见答案)
  • 谢谢马克!我错过了早些时候的回复 - 所以问题是项目有一些构建配置不匹配的解决方案解决了这个问题。

标签: inheritance protocol-buffers


【解决方案1】:

我无法复制;我有 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

【讨论】:

    猜你喜欢
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多