gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:49:04 45 4
gpt4 key购买 nike

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

例如:

public class SomeBase
{
...
}

public class SomeDerived : SomeBase
{
...
}

以及以下要序列化的字段:

public List<SomeBase> SomeList;

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

最佳答案

要让它工作,您只需分配一个标签(数字),它将用于识别子类型。基本上,核心“ Protocol Buffer ”线路规范不处理继承,因此 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
}
}

关于c# - 如何在 Protobuf/Protobuf-net 中使用一些对象继承的列表/数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1363899/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com