76

Serializable属性を使用することとISerializableインターフェースを実装することの違いは何ですか?

4

5 に答える 5

43

属性を使用する場合SerializableAttribute、コンパイル時にフィールドに属性を配置します。これにより、実行時に、シリアル化機能は、クラス/モジュール/アセンブリでリフレクションを実行することにより、属性に基づいて何をシリアル化するかを認識します。タイプ。

[Serializable]
public class MyFoo { … }

上記は、シリアル化機能がクラス全体をシリアル化する必要があることを示していますが、次のようになりますMyFoo

public class MyFoo
{
    private int bar;

    [Serializable]
    public int WhatBar
    {
       get { return this.bar; }
    }
}

属性を使用して、シリアル化する必要のあるフィールドを選択的に選択できます。

ISerializableインターフェイスを実装すると、シリアル化はカスタムバージョンで効果的にオーバーライドされ、オーバーライドすること(およびフォームのコンストラクターを提供することで)、データのシリアル化をより細かく制御できます。GetObjectData SetObjectDataMyFoo(SerializationInfo info, StreamingContext context)

StackOverflowのカスタムシリアル化のこの例も参照してください。これは、シリアル化を、シリアル化されたデータのさまざまなバージョンとの下位互換性を維持する方法を示しています。

お役に立てれば。

于 2010-03-02T17:48:28.227 に答える
20

SerializableAttributeは、デフォルトのシリアル化プロセスを実行するようにフレームワークに指示します。さらに制御が必要な場合は、ISerializableインターフェイスを実装できます。次に、独自のコードを配置してオブジェクトをメソッドにシリアル化し、渡されGetObjectDataたオブジェクトを更新します。SerializationInfo

于 2010-03-02T17:20:43.197 に答える
3

このISerializableインターフェースでは、デフォルト以外のカスタムシリアル化を実装できます。インターフェイスを実装するときは、次のようにメソッドISerializableをオーバーライドする必要がありますGetObjectData

public void GetObjectData (SerializationInfo serInfo, 
                                    StreamingContext streamContext)
{
   // Implement custom Serialization
}
于 2010-03-02T17:25:13.283 に答える
1

ISerializeは、シリアル化ロジックを手動で実装するように強制しますが、Serializable属性(つまり、それを意味しますか?)でマークすると、このクラスをシリアル化できることをBinaryserializerに通知します。自動的に行います。

于 2010-03-02T17:20:52.540 に答える
0

ISerializableから継承すると、(逆)シリアル化をカスタム実装できます。Serializable属性のみを使用する場合、(de)serializationは属性によってのみ制御でき、柔軟性が低くなります。

于 2010-03-02T17:21:22.553 に答える