3

以下に示すように、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))]」を明示的に含めると機能する理由

ありがとう

4

1 に答える 1

1

基本的に、シリアライザーに関する限り、これは重大な変更です。ワイヤ層では、「クラス」も「インターフェース」も存在しないため、ストレージの観点からは、これはクラスの基本型を変更することに似ています。シリアル化時のルート タイプはMyOrder- であり、逆シリアル化中のルート タイプはITestMessageです。これでは幸せにはなりません。

基本的に:それはできません。

于 2013-08-19T07:19:53.920 に答える