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

C# 如何在Protobuf/Protobuf-net中使用某些对象继承的列表/数组?,c#,.net,serialization,protocol-buffers,protobuf-net,C#,.net,Serialization,Protocol Buffers,Protobuf Net,使用Protobuf/Protobuf net和两个类,一个基类,另一个派生自基类。 如何序列化/反序列化列表 例如: public class SomeBase { ... } public class SomeDerived : SomeBase { ... } 以及要序列化的以下字段: public List<SomeBase> SomeList; 公共列表SomeList; 请记住,该列表包含一些基本对象和一些派生对象。要实现这一点,只需分配一个标记(

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

例如:

public class SomeBase
{
    ...
}

public class SomeDerived : SomeBase
{
    ...
}
以及要序列化的以下字段:

public List<SomeBase> SomeList;
公共列表SomeList;

请记住,该列表包含一些基本对象和一些派生对象。

要实现这一点,只需分配一个标记(编号),它将用于标识子类型。基本上,核心的“协议缓冲区”wire规范不处理继承,因此protobuf net通过将继承建模为封装来实现它。您可以通过
[ProtoInclude]
(与
[xmlclude]
相比)在带有
[ProtoMember]
的属性/字段和子类型上分配标记

请注意,标记在任何单个类型中都必须是唯一的,但它们可以在子类型中重复使用-如示例中使用标记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
    }
}
使用System.Collections.Generic;
使用ProtoBuf;
[原始合同]
[ProtoInclude(20,typeof(SomeDerived))]
公共类库
{
[原成员(1)]
公共字符串BaseProp{get;set;}
}
[原始合同]
公共类some派生:SomeBase
{
[原成员(1)]
public int-DerivedProp{get;set;}
}
[原始合同]
公共类实体
{
[原成员(1)]
公共列表;
}
班级计划
{
静态void Main()
{
SomeEntity orig=新的SomeEntity
{
SomeList=新列表{
新SomeBase{BaseProp=“abc”},
新的SomeDerived{BaseProp=“def”,DerivedProp=123}
}
};
var clone=Serializer.DeepClone(orig);
//克隆现在有一个包含2项的列表,SomeBase和SomeDerivated各一项
}
}

2个问题:另一端的人能用Java/C++处理这个问题吗?第二个问题:这在.proto中可行吗?(如果两者都是,你能提供样品吗?ty@Davidprotobuf net通过封装实现继承,因此SomeBase将有一个可选的SomeDerivated类型的字段,字段号为20。GetProto/GetSchema将说明这一点。但是,protobuf net不会在codegen层中生成继承(如果从.proto开始),因为.proto没有隐喻来描述这种情况。