1

protobuf-netコントラクトを定義するために使用されるタイプ階層をフラット化したいのですが、現在、次のようなものがあります。

[ProtoContract]
public class SubClass : BaseClass
{
   [ProtoMember(1)]
   public string Prop1 { get; set; }
}

[ProtoContract]
[ProtoInclude(1, typeof(SubClass))]
public class BaseClass
{
   [ProtoMember(100)]
   public string Prop2 { get; set; }
}

そして、これをリファクタリングして

[ProtoContract]
public class SubClass
{
   [ProtoMember(1)]
   public string Prop1 { get; set; }

   [ProtoMember(100)]
   public string Prop2 { get; set; }
}

リファクタリングの前にシリアル化されたインスタンスが正常に逆シリアル化されるようにします。これは、正しいインデックスを選択するだけで可能ですか、それとももっと何かをする必要がありますか?

4

1 に答える 1

1

内部では、protobuf-net の継承は、基本的にマルチレベルの操作である方法で実装されています。それをモデル化するのは簡単ではありません。率直に言って、auto-mapper のようなものを使用する方が簡単かもしれません。つまり、古いモデルにデータをロードします。それを新しいモデルにマップします。新しいモデルをシリーズ化します。これは重大な変更であり、それ以降はデータに互換性がなくなることに注意してください。ただし、少し醜いものに耐えることができる場合は、1 つのモデルでそれを行うことができます (ただし、機能させるために異なるフィールド番号を指定する必要があったことに注意してください)。

[ProtoContract]
public class NewClass
{
    [ProtoMember(2)]
    public string Prop1 { get; set; 

    [ProtoMember(100)]
    public string Prop2 { get; set; }

    [ProtoMember(1)] // this 1 is from ProtoMember
    private Shim ShimForSerialization { get { return new Shim(this); } }

    // this disables the shim during serialiation; only Prop1 and Prop2 will
    // be written
    public bool ShouldSerializeShimForSerialization() { return false; }

    [ProtoContract]
    private class Shim {
        private readonly NewClass parent;
        public Shim(NewClass parent) {
            this.parent = parent;
        }
        [ProtoMember(1)]
        public string Prop1 {
            get { return parent.Prop1;}
            set { parent.Prop1 = value;}
        }

    }
}
于 2013-01-11T13:58:28.200 に答える