2013-02-12 16 views
5

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

例えば、私は次のクラスを持っていると言う:

[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はシリアル化された値をまだ適用していないので、コンストラクタでそれを呼び出すことは無意味です。そのため、値の適用が終了したときを知る方法があると良いでしょう。オブジェクトを使用しているすべての場所で、デシリアライズ後の呼び出しをリファクタリングする必要性を排除するために、これを実現する方法があることを期待しています。

私はいくつかのアイデアを持っていますが、誰かが私がまだ見ていないより良いものを持っている場合に備えて、私はそれらを校正する道を進む前に質問を投稿すると思いました。前もって感謝します。

答えて

14

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

WCFでは、これらのメソッドに固有の署名が必要ですが、protobuf-netはWCFシグネチャで動作しますが、パラメータなしメソッド、または通常のパラメータ、またはprotobuf-net独自のシリアル化コンテキスト。

+0

私はシンプルなソリューションを愛しています。これは、私が行ったばかげたルート(デシリアライズされたオブジェクトを反映している静的なデシリアライゼーションクラスとメソッドなどを呼び出す方法など)よりも簡単です。ありがとうMarc、これは私が必要としていたものです。 – Ryan