2011-12-21 13 views
4

可能性の重複:
What's the difference between using the Serializable attribute & implementing ISerializable?ISerializableでは[Serializable]属性は何をしますか?

タグ付けにSerializableclassは何をしますか?例えば:それはISerializableを実装class異なる方法

[Serializable] 
public Hashtable 
{ 
} 

?例えば:

public Hashtable : ISerializable 
{ 
} 

そして、どのようにSerializableとしてclassをタグ付けしてISerializableを実装するからその違うのですか? ISerializableとは対照的に、例えば:

[Serializable] 
public Hashtable : ISerializable 
{ 
} 

[Serializable]の目的は何ですか?

tl; dr[Serializable]とは何ですか?

+0

独自のリンクから:「クラスでシリアル化プロセスを制御する必要がある場合、ISerializableインターフェイスを実装できます」 –

+0

http://stackoverflow.com/questions/2365152/whats-the-difference-between-using-the -serializable-attribute-implemented-is – BFree

+0

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

答えて

14

は、私はあなたがSerializableにリンクされているのだと思ったが、あなたはしませんでした:

SerializableAttributeによってマークされた型のすべてのパブリックフィールドとプライベートフィールドは、型がISerializableインターフェイスを実装してシリアル化プロセスをオーバーライドしない限り、既定でシリアル化されます。 Serializable属性は、このタイプができることを示している

と、

[...]クラスでもISerializableインタフェースを実装した場合でもSerializableAttribute属性を適用します

をシリアル化する必要があります。 ISerializableは、このタイプが制御したいことを示します。このタイプがシリアル化されています。


または、別の言い方をすると、あなたの質問は間違った方法で表現されます。 SerializableAttributeは常ににする必要があります(シリアライズ可能なクラスに)適用され、シリアライゼーションの "基本的な"レベルです。 ISerializableは、(プロセスを制御するためのコードを書くことを許可することによって)moreを追加します。

+0

あるタイプのパブリックフィールドまたはプライベートフィールドに '[Serializable]'というタグを付けて他のフィールドをタグ付けしないと、どういう意味ですか?それは無意味ではないですか? –

+0

@IanBoyd - フィールドをタグ付けしてコンパイルすると、コンパイラがクラス、構造体、デリゲート、および列挙型にのみ適用されると宣言されている属性使用ヒントに従わないことを意味します。 –

+0

Ohhh ...クラスを直列化することができますし、 'ISerializable'を実装する必要もありません**。トリッキー! –

4

ISerializableあなたは[Serializable]ディレクティブは、コンパイラは、このクラスをシリアル化することができます知ることができます方法void GetObjectData

を実装/上書きしなければならないことを意味します。そして、CLRクラスが要件を満たしていない場合に例外がスローされます。つまりデフォルトコンストラクタ、未知の種類など

関連する問題