protobuf-netを使用して、派生クラスを基本クラスとしてシリアライズしたいと思います。protobuf-net基本クラスとしてシリアライズ
[ProtoContract]
class Base
{
[ProtoMember(1)]
public string PublicInfo { get; set; }
}
class Derived : Base
{
public string SecretInfo { get; set; }
}
class Program
{
static void Main(string[] args)
{
Derived d = new Derived()
{
PublicInfo = "public info",
SecretInfo = "secret info"
};
using (var ms = new MemoryStream())
{
Serializer.NonGeneric.Serialize(ms, d as Base);
ms.Seek(0, SeekOrigin.Begin);
Base deserialized = Serializer.Deserialize<Base>(ms);
Console.WriteLine("Deserialized type: " + deserialized.GetType());
Console.WriteLine("Deserialized value: " + deserialized.PublicInfo);
}
Console.ReadLine();
}
}
は私が
Deserialized type: Base
Deserialized value: public info
を生成するために、上記のプログラムが欲しいが、代わりに、私は "についての例外を取得:他の言葉で、私は、シリアル化プロセスが、タイプが導出されていること兆候を破棄したいですタイプは期待されていません "。
[ProtoContract]
〜Derived
を追加すると、PublicInfo
フィールドは設定されません。また、[ProtoInclude(2, typeof(Derived))]
をBase
に追加すると、逆直列化タイプはDerived
で、Base
ではありません。
私には何が欠けていますか?私が他のどこかで答えを見落としてしまったことを謝罪します。 this questionの逆のようなものを求めていると思いますが、RuntimeTypeModel
で明示的にフィールドを追加する必要はありません。
これは素晴らしい点です。ありがとうございます。 – Gabriel