Serializable
属性の使用とISerializable
インターフェイスの実装の違いは何ですか?
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のカスタムシリアル化のこの例 も参照してください。シリアル化されたデータの異なるバージョンとのシリアル化の下位互換性を維持する方法を示します。
お役に立てれば。
SerializableAttribute は、デフォルトのシリアル化プロセスを実行するようフレームワークに指示します。さらに制御が必要な場合は、 ISerializable interface を実装できます。次に、独自のコードを挿入してGetObjectData
メソッドにオブジェクトをシリアル化し、渡されたSerializationInfo
オブジェクトを更新します。
ISerializable
インターフェイスを使用すると、デフォルト以外のカスタムシリアル化を実装できます。 ISerializable
インターフェイスを実装する場合、次のようにGetObjectData
メソッドをオーバーライドする必要があります
public void GetObjectData (SerializationInfo serInfo,
StreamingContext streamContext)
{
// Implement custom Serialization
}
ISerializeは、シリアル化ロジックを手動で実装することを強制しますが、Serializable属性でマークすると(つまり?)、このクラスをシリアル化できることがBinaryシリアライザーに通知されます。自動的に行われます。
ISerializableから継承すると、(デ)シリアル化をカスタム実装できます。 Serializable属性のみを使用する場合、(de)serializationは属性によってのみ制御でき、柔軟性が低下します。