7

デシリアライズされたオブジェクトからメソッドを明示的に呼び出さなくても、Protobufによってデシリアライズされたばかりのオブジェクトにイベントを処理したりコールバックしたりする方法はありますか?

たとえば、次のクラスがあるとします。

[ProtoContract]
public class Customer
{
    [ProtoMember(1)]
    public string FirstName { get; set; }

    [ProtoMember(2)]
    public string MiddleName { get; set; }

    [ProtoMember(3)]
    public string LastName { get; set; }

    [ProtoMember(4)]
    public Dictionary<int, string> Addresses { get; set; }

    public Customer()
    {
        //Subscibe to a Protobuf deserialization complete event?
    }

    public void ValidateAddresses()
    {
        //Some routine to validate addresses
    }
}

デシリアライズされたコードブロック内のデシリアライズされたオブジェクトから明示的に呼び出すことなく、「ValidateAddresses」を呼び出す方法はありますか?Protobufはまだシリアル化された値を適用していないため、コンストラクターで呼び出すことは無意味です。したがって、値の適用がいつ終了したかを知る方法があると便利です。オブジェクトが使用されているすべての場所でデシリアライズ後の呼び出しをリファクタリングする必要をなくすために、これを実現する方法があることを望んでいます。

私にはいくつかのアイデアがありますが、私がまだ見ていないより良いものを誰かが持っている場合に備えて、それらを証明する道を進む前に質問を投稿すると思いました(これは非常に可能性が高いです)。前もって感謝します。

4

1 に答える 1

18

はい。Protobuf-netは、標準のシリアル化コールバックをサポートしています。WCF / DataContractSerializer属性、またはprotobuf-net固有の属性のいずれかを介して。[OnDeserializedAttribute]具体的には、またはのいずれかでメソッドをマークすると[ProtoAfterDeserialization]、逆シリアル化の最後に呼び出されます。メソッドは、シリアル化前、シリアル化後、逆シリアル化前、および逆シリアル化後に呼び出すことができます。

WCFは、これらのメソッドに特定の署名を必要としますが、protobuf-netはそれほど煩雑ではありません。WCF署名で機能しますが、パラメーターなしのメソッド、通常のパラメーターの任意の組み合わせ、またはprotobuf-net独自のシリアル化コンテキストも許可します。

于 2013-02-12T18:37:23.960 に答える