如何使用Protobuf / Protobuf-net使用某些对象继承的列表/数组?

时间:2009-09-01 18:25:30

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

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

例如:

public class SomeBase
{
    ...
}

public class SomeDerived : SomeBase
{
    ...
}

以下要序列化的字段:

public List<SomeBase> SomeList;

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

1 个答案:

答案 0 :(得分:3)

要使其正常工作,您只需指定一个标记(编号),用于标识子类型。基本上,核心“协议缓冲”线规不处理继承,因此protobuf-net通过将继承建模为封装来实现它。您可以使用[ProtoMember]在属性/字段上分配代码,并通过[ProtoInclude]分配子类型(与[XmlInclude]进行比较)。

请注意,标记在任何类型中必须是唯一的,但它们可以在子类型中重复使用 - 如示例中所示,两个级别都使用标记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
    }
}