web-dev-qa-db-ja.com

Serializable属性の使用とISerializableの実装の違いは何ですか?

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

73
SoftwareGeek

SerializableAttribute 属性を使用すると、コンパイル時にフィールドに属性を設定し、実行時にシリアル化機能が何に基づいてシリアル化するかを認識します。 class/module/Assemblyタイプでリフレクションを実行することにより、属性について。

_[Serializable]
public class MyFoo { … }
_

上記は、シリアライズ機能がクラスMyFoo全体をシリアライズする必要があることを示しています。

_public class MyFoo
{
    private int bar;

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

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

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

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

お役に立てれば。

41
t0mm13b

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

20
Segfault

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

public void GetObjectData (SerializationInfo serInfo, 
                                    StreamingContext streamContext)
{
   // Implement custom Serialization
}
3
Asad Butt

ISerializeは、シリアル化ロジックを手動で実装することを強制しますが、Serializable属性でマークすると(つまり?)、このクラスをシリアル化できることがBinaryシリアライザーに通知されます。自動的に行われます。

1
Andrey

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

0
logicnp