13

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

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.
    }
}

どちらかを選択する特定の長所/短所、またはシナリオはありますか?

4

4 に答える 4

10

これら 2 つは異なる目的を果たし、同じ意味で使用することはできません。ほとんどの場合、インターフェースの方が適切に機能するでしょう。

説明については、こちらを ご覧ください。

于 2010-06-23T19:38:25.170 に答える
8

上記のリンクからの Darren Headrick の投稿 (完全を期すため) :

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

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

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

于 2012-12-18T10:35:25.033 に答える
2

このブログ投稿に関するさらなる議論

于 2012-12-18T10:36:33.740 に答える
1

私も同じことを疑問に思いました。長所/短所に関する限り、インターフェイスには正しいメソッド シグネチャを実装する必要があるという点で利点があるとしか考えられませんが、バージョン属性を使用すると、メソッド シグネチャがどのように見えるかに関係なく、喜んでクラスをコンパイルできます。 .

于 2009-09-20T09:11:22.593 に答える