ここでは実際には特別なことは何も必要ありません...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
、元のデータが何であったかに応じてまたはMyBase
を構築します。Foo
Bar
したがって、以下はほとんど同じです。
Serializer.Serialize<BaseType>(dest, obj);
...
BaseType obj = Serializer.Deserialize<BaseType>(source);
と
Serializer.Serialize<DerivedType>(dest, obj);
...
DerivedType obj = Serializer.Deserialize<DerivedType>(source);
ここでの主な違いは、変数の入力方法です。