2009-08-20 21 views
11

私が理解する限り、IDeserializationCallbackインターフェイスとOnDeserializedイベントは、オブジェクトを逆シリアル化した後にいくつかのタスクを実行する必要がある場合に使用できます。IDeserializationCallbackとOnDeserializedAttributeとの比較

IDeserializationCallback:

[Serializable] 
public class Foo : IDeserializationCallback 
{ 
    public void OnDeserialization(object sender) 
    { 
     // initialize unserialized fields etc. 
    } 
} 

OnDeserializedイベント:

[Serializable] 
public class Foo 
{ 
    [OnDeserialized] 
    public void OnDeserialized(StreamingContext context) 
    { 
     // initialize unserialized fields etc. 
    } 
} 

は、任意の特定の長所/短所たり、他の上で1つを選ぶだろうなシナリオがありますか?

答えて

2

私は同じことを考えました。私の知る限りでは、メソッドのシグネチャがどのように見えるかに関係なく、属性バージョンがうまくクラスをコンパイルできるように、正しいメソッドシグネチャを実装する必要があるという点で、インターフェイスに利点があります。 。

+0

良い点。これは、IDeserializationCallbackインターフェイスを使用することの非常に優れた利点です。 –

+2

実際にはこれは正解ではありません - Valの答えを見てそこのリンクに従ってください。 –

5

ダレンHeadrickの記事を:

DeserializationCallback.OnDeserialization「オブジェクトグラフ全体が逆シリアル化されたときに実行します。」 (link)。

ただし、 "逆シリアル化された後、グラフが返される前に、逆シリアル化されたオブジェクトの値を修正する必要がある場合、OnDeserializedAttributeを使用します。この属性は、IDeserializationCallbackインターフェイスの代わりに使用できます。 (link)。

オブジェクトグラフを変更するためにOnDeserialized属性を使用できるため、OnDeserialization(オブジェクトグラフが最終状態にあることを示す)の前に呼び出されます。

関連する問題