Serializable
属性を使用することとISerializable
インターフェースを実装することの違いは何ですか?
5 に答える
属性を使用する場合SerializableAttribute
、コンパイル時にフィールドに属性を配置します。これにより、実行時に、シリアル化機能は、クラス/モジュール/アセンブリでリフレクションを実行することにより、属性に基づいて何をシリアル化するかを認識します。タイプ。
[Serializable]
public class MyFoo { … }
上記は、シリアル化機能がクラス全体をシリアル化する必要があることを示していますが、次のようになりますMyFoo
。
public class MyFoo
{
private int bar;
[Serializable]
public int WhatBar
{
get { return this.bar; }
}
}
属性を使用して、シリアル化する必要のあるフィールドを選択的に選択できます。
ISerializable
インターフェイスを実装すると、シリアル化はカスタムバージョンで効果的にオーバーライドされ、オーバーライドすることで(およびフォームのコンストラクターを提供することで)、データのシリアル化をより細かく制御できます。GetObjectData
SetObjectData
MyFoo(SerializationInfo info, StreamingContext context)
StackOverflowのカスタムシリアル化のこの例も参照してください。これは、シリアル化を、シリアル化されたデータのさまざまなバージョンとの下位互換性を維持する方法を示しています。
お役に立てれば。
SerializableAttributeは、デフォルトのシリアル化プロセスを実行するようにフレームワークに指示します。さらに制御が必要な場合は、ISerializableインターフェイスを実装できます。次に、独自のコードを配置してオブジェクトをメソッドにシリアル化し、渡されGetObjectData
たオブジェクトを更新します。SerializationInfo
このISerializable
インターフェースでは、デフォルト以外のカスタムシリアル化を実装できます。インターフェイスを実装するときは、次のようにメソッドISerializable
をオーバーライドする必要がありますGetObjectData
public void GetObjectData (SerializationInfo serInfo,
StreamingContext streamContext)
{
// Implement custom Serialization
}
ISerializeは、シリアル化ロジックを手動で実装するように強制しますが、Serializable属性(つまり、それを意味しますか?)でマークすると、このクラスをシリアル化できることをBinaryserializerに通知します。自動的に行います。
ISerializableから継承すると、(逆)シリアル化をカスタム実装できます。Serializable属性のみを使用する場合、(de)serializationは属性によってのみ制御でき、柔軟性が低くなります。