以下に示すように、protobuf-net バージョン 2.0.0.640 を使用して一部のデータをシリアル化しています。
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public interface ITestMessage
{
}
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public class MyOrder : ITestMessage
{
public int Amount { get; set; }
}
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public class MyOrderWrapper
{
public MyOrder Order { get; set; }
}
[TestMethod]
public void TestOrderSerialize()
{
var order = new MyOrder() {Amount = 10};
var orderWrapper = new MyOrderWrapper() { Order = order };
using (var file = File.Create("C:\\temp\\order.bin"))
{
Serializer.Serialize<MyOrderWrapper>(file, orderWrapper);
}
}
ここで、「ITestMessage」と「MyOrder」の間の継承依存関係を次のコードを使用して宣言するとします。
RuntimeTypeModel.Default[typeof(ITestMessage)].AddSubType(2, typeof(MyOrder));
以前に保存したデータを逆シリアル化しようとすると、次のエラーが発生します。「ITestMessage のパラメーターなしのコンストラクターが見つかりません」。
[TestMethod]
public void TestOrderDeserialize()
{
RuntimeTypeModel.Default[typeof(ITestMessage)].AddSubType(2, typeof(MyOrder));
MyOrderWrapper orderWrapper;
using (var file = File.OpenRead("C:\\temp\\order.bin"))
{
orderWrapper = Serializer.Deserialize<MyOrderWrapper>(file);
}
}
「MyOrderWrapper」が継承階層で「MyOrder」よりも上位のものを参照していない場合に、なぜこれが起こるのか説明してください。
また、「ITestMessage」に「[ProtoInclude(2, typeof(MyOrder))]」を明示的に含めると機能する理由
ありがとう