使用 Protobuf/Protobuf-net 和两个类,一个是基类,另一个是从基类派生的。
您将如何序列化/反序列化列表?
例如:
public class SomeBase
{
...
}
public class SomeDerived : SomeBase
{
...
}
以及要序列化的以下字段:
public List<SomeBase> SomeList;
请记住,该列表包含 SomeBase 和 SomeDerived 对象。
使用 Protobuf/Protobuf-net 和两个类,一个是基类,另一个是从基类派生的。
您将如何序列化/反序列化列表?
例如:
public class SomeBase
{
...
}
public class SomeDerived : SomeBase
{
...
}
以及要序列化的以下字段:
public List<SomeBase> SomeList;
请记住,该列表包含 SomeBase 和 SomeDerived 对象。
要使其工作,您只需分配一个标签(编号),它将用于识别子类型。基本上,核心“协议缓冲区”线路规范不处理继承,因此 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
}
}