【问题标题】:How to use list/array of some object inheritance with Protobuf/Protobuf-net?如何在 Protobuf/Protobuf-net 中使用某些对象继承的列表/数组?
【发布时间】:2010-11-24 17:38:13
【问题描述】:

使用 Protobuf/Protobuf-net 和两个类,一个是基类,另一个是从基类派生的。
您将如何序列化/反序列化列表?

例如:

public class SomeBase
{
    ...
}

public class SomeDerived : SomeBase
{
    ...
}

还有下面要序列化的字段:

public List<SomeBase> SomeList;

请记住,该列表包含 SomeBase 和 SomeDerived 对象。

【问题讨论】:

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


    【解决方案1】:

    要使其工作,您只需分配一个标签(数字),它将用于识别子类型。基本上,核心“协议缓冲区”线路规范不处理继承,因此 protobuf-net 通过将继承建模为封装来实现它。您使用[ProtoMember] 为属性/字段分配标签,并通过[ProtoInclude] 分配子类型(与[XmlInclude] 相比)。

    请注意,标签在任何 single 类型中必须是唯一的,但它们可以在子类型中重复使用 - 如示例中使用标签 1 的两个级别所示。

    像这样:

    using System.Collections.Generic;
    using ProtoBuf;
    
    [ProtoContract]
    [ProtoInclude(20, typeof(SomeDerived))]
    public class SomeBase
    {
        [ProtoMember(1)]
        public string BaseProp { get; set; }
    }
    [ProtoContract]
    public class SomeDerived : SomeBase
    {
        [ProtoMember(1)]
        public int DerivedProp { get; set; }
    }
    [ProtoContract]
    public class SomeEntity
    {
        [ProtoMember(1)]
        public List<SomeBase> SomeList;
    }
    
    class Program
    {
        static void Main()
        {
            SomeEntity orig = new SomeEntity
            {
                SomeList = new List<SomeBase> {
                    new SomeBase { BaseProp = "abc"},
                    new SomeDerived { BaseProp = "def", DerivedProp = 123}
                }
            };
            var clone = Serializer.DeepClone(orig);
            // clone now has a list with 2 items, one each SomeBase and SomeDerived
        }
    }
    

    【讨论】:

    • 2 个问题:线路另一端的人是否能够在 Java/C++ 中处理这个问题?第二个问题:这对 .proto 是否可行?(如果两者都可以,请提供 .proto 样本?ty
    • @David protobuf-net 通过封装实现继承,因此 SomeBase 将有一个 SomeDerived 类型的可选字段,字段编号为 20。GetProto/GetSchema 将说明这一点。但是,protobuf-net 不会在 codegen 层中生成继承(如果从 .proto 开始),因为 .proto 没有比喻来描述这种情况。
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多