你实际上不需要任何特别的东西......因为 protobuf-net 尊重继承。如果你有:
[ProtoInclude(typeof(Foo), 20)]
[ProtoInclude(typeof(Bar), 21)]
public abstract class MyBase {
/* other members */
public byte[] GetBytes()
{
using(MemoryStream ms = new MemoryStream())
{
Serializer.Serialize<MyBase>(ms, this); // MyBase can be implicit
return ms.ToArray();
}
}
}
[ProtoContract]
class Foo : MyBase { /* snip */ }
[ProtoContract]
class Bar : MyBase { /* snip */ }
那么它将起作用。要序列化数据,它总是从基本(合同)类型开始;因此,即使您做Serializer.Serialize<Foo>(stream, obj)
了第一件事,它也会检测到它有一个作为合同的基类,然后切换到MyBase
. 在反序列化期间,它将识别正确的派生(具体)类型并使用它,因此您也可以使用Deserialize
with MyBase
,它会根据原始数据的内容构造一个Foo
or 。Bar
因此,以下内容基本相同:
Serializer.Serialize<BaseType>(dest, obj);
...
BaseType obj = Serializer.Deserialize<BaseType>(source);
和
Serializer.Serialize<DerivedType>(dest, obj);
...
DerivedType obj = Serializer.Deserialize<DerivedType>(source);
这里的主要区别是变量的类型。