ISerializable インターフェイス
オブジェクトが独自のシリアル化および逆シリアル化を制御できるようにします。
この型のすべてのメンバの一覧については、ISerializable メンバ を参照してください。
Public Interface ISerializable
[C#]
public interface ISerializable
[C++]
public __gc __interface ISerializable
[JScript]
public interface ISerializable
ISerializable を実装するクラス
クラス | 説明 |
---|---|
Assembly | Assembly を定義します。このアセンブリは再利用でき、バージョン管理可能で自己記述型の共通言語ランタイム アプリケーションのビルド ブロックです。 |
AssemblyName | アセンブリの一意の ID を完全に記述します。 |
AxHost.State | ActiveX コントロールの永続化された状態をカプセル化します。 |
Cursor | マウス ポインタの描画に使用されるイメージを表します。 |
DataSet | データのメモリ内キャッシュを表します。 |
DataTable | インメモリ データのテーブル 1 つを表します。 |
DBNull | null 値を表します。 |
Delegate | 静的メソッドまたはクラス インスタンスとそのクラスのインスタンス メソッドを参照するデータ構造体であるデリゲートを表します。 |
EventLogEntry | イベント ログの単一レコードをカプセル化します。このクラスは継承できません。 |
Exception | アプリケーションの実行中に発生するエラーを表します。 |
FileSystemInfo | FileInfo オブジェクトと DirectoryInfo オブジェクトの両方の基本クラスを提供します。 |
Font | フォント フェイス、サイズ、スタイルの各属性など、テキストの特定の書式を定義します。このクラスは継承できません。 |
Hash | アセンブリのハッシュ値に関する証拠を提供します。このクラスは継承できません。 |
Hashtable | キーのハッシュ コードに基づいて編成された、キーと値の組み合わせのコレクションを表します。 |
Icon | Windows のアイコン (オブジェクトを表すために使用される小さなビットマップ イメージ) を表します。アイコンは透明なビットマップと考えることもできますが、そのサイズはシステムによって決定されます。 |
Image | Bitmap および Metafile の派生クラス機能を提供する抽象基本クラス。 |
ImageListStreamer | ImageList のデータ部分を提供します。 |
ListViewItem | ListView コントロールの項目を表します。 |
LogicalCallContext | リモートのメソッド呼び出し時に、実行コード パスと共に転送されるプロパティのセットを提供します。 |
ManagementBaseObject | 管理オブジェクトの基本要素を格納します。より固有な管理オブジェクト クラスの基本クラスとしての役割を果たします。 |
Module | モジュールのリフレクションを実行します。 |
NameObjectCollectionBase | 関連付けられた String キーおよび Object 値のコレクションの抽象 (Visual Basic では MustInherit) 基本クラスを提供します。これらのキーおよび値には、キーまたはインデックスのいずれかを使用してアクセスできます。 |
ObjRef | プロキシを生成してリモート オブジェクトと通信するために必要なすべての関連情報を格納します。 |
Pointer | ポインタのラッパー クラスを提供します。 |
Regex | 変更不可の正規表現を表します。 |
SoapFault | SOAP メッセージ内にエラー情報およびステータス情報を格納します。このクラスは継承できません。 |
ToolboxItem | ツールボックス項目の基本の実装を提供します。 |
TreeNode | TreeView のノードを表します。 |
Uri | URI (Uniform Resource Identifier) のオブジェクト表現を可能にし、URI の一部へ簡単にアクセスできるようにします。 |
WeakReference | "弱い参照" を表します。弱い参照は、ガベージ コレクションの対象のまま、オブジェクトを参照します。 |
WebProxy | WebRequest クラスの HTTP プロキシ設定を格納します。 |
WebRequest | URI (Uniform Resource Identifier) への要求を行います。これは抽象 (Visual Basic では MustInherit) クラスです。 |
WebResponse | URI (Uniform Resource Identifier) からの応答を利用できるようにします。これは抽象 (Visual Basic では MustInherit) クラスです。 |
WindowsIdentity | Windows ユーザーを表します。 |
解説
シリアル化される可能性があるクラスは、 SerializableAttribute でマークする必要があります。クラスがクラス自体のシリアル化プロセスを制御する必要がある場合は、 ISerializable インターフェイスを実装できます。 Formatter は、シリアル化時に GetObjectData を呼び出し、提供された SerializationInfo にオブジェクトを表すために必要なすべてのデータを設定します。 Formatter は、グラフ内のオブジェクトの型を使用して SerializationInfo を作成します。自らのプロキシを送信する必要があるオブジェクトは、 SerializationInfo で FullTypeName メソッドおよび AssemblyName メソッドを使用して、送信された情報を変更できます。
シリアル化されたクラスの親クラスが ISerializable を実装する場合は、基本クラスの GetObjectData の実装を呼び出します。
ISerializable インターフェイスは、シグネチャ コンストラクタ (SerializationInfo 情報、 StreamingContext コンテキスト) を使用して、コンストラクタを示します。逆シリアル化時に現在のコンストラクタが呼び出されるのは、フォーマッタが SerializationInfo のデータを逆シリアル化した後だけです。通常、クラスがシール (Visual Basic では NotInheritable) クラスでない場合は、このコンストラクタを保護する必要があります。
シリアル化アーキテクチャでは、 Object を拡張する型の処理と同様に、 MarshalByRefObject を拡張するオブジェクト型が処理されます。これらの型は、 SerializableAttribute でマークして、ほかのオブジェクト型のように ISerializable インターフェイスを実装できます。それらのオブジェクトの状態は、キャプチャされ、ストリームに永続化されます。
これらの型が System.Runtime.Remoting を経由して使用されると、リモート処理インフラストラクチャによって、通常のシリアル化より優先されるサロゲートが提供され、代わりに MarshalByRefObject へのプロキシがシリアル化されます。サロゲートは、特定の型のオブジェクトをシリアル化および逆シリアル化する方法を把握しているヘルパです。プロキシはユーザーに見えないことが多く、 ObjRef 型です。
注意 通常、一般的なデザイン パターンとして、クラスがシリアル化できる属性でマークされ MarshalByRefObject を拡張することはありません。この 2 つの特性を組み合わせる場合、開発者は、使用できるシリアル化およびリモート処理方法について慎重に検討する必要があります。一例として、 MemoryStream を使用することが考えられます。 MemoryStream (Stream) の基本クラスを MarshalByRefObject から拡張すると、 MemoryStream の状態をキャプチャして、自由にそれを復元できます。したがって、このストリームの状態をデータベースにシリアル化して、後でそれを復元できます。ただし、リモート処理を通して使用すると、この型のオブジェクトはプロキシ扱いになります。
MarshalByRefObject を拡張するクラスのシリアル化の詳細については、 RemotingSurrogateSelector のトピックを参照してください。 ISerializable の実装方法の詳細については、「 シリアル化のカスタマイズ 」を参照してください。
実装時の注意: このインターフェイスを実装して、オブジェクトが独自のシリアル化および逆シリアル化を実行できるようにします。
使用例
[Visual Basic, C#, C++] クラスのカスタム シリアル化動作を定義するために、 ISerializable インターフェイスを使用するコード例を次に示します。
Imports System
Imports System.IO
Imports System.Collections
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Runtime.Serialization
' There should be only one instance of this type per AppDomain.
<Serializable()> Public NotInheritable Class Singleton
Implements ISerializable
' This is the one instance of this type.
Private Shared ReadOnly theOneObject As New Singleton
' Here are the instance fields.
Public someString As String
Public someNumber As Int32
' Private constructor allowing this type to construct the Singleton.
Private Sub New()
' Do whatever is necessary to initialize the Singleton.
someString = "This is a string field"
someNumber = 123
End Sub
' A method returning a reference to the Singleton.
Public Shared Function GetSingleton() As Singleton
Return theOneObject
End Function
' A method called when serializing a Singleton.
Private Sub GetObjectData(ByVal info As SerializationInfo, _
ByVal context As StreamingContext) _
Implements ISerializable.GetObjectData
' Instead of serializing this object, we will
' serialize a SingletonSerializationHelp instead.
info.SetType(GetType(SingletonSerializationHelper))
' No other values need to be added.
End Sub
' Note: ISerializable's special constructor is not necessary
' because it is never called.
End Class
<Serializable()> Friend NotInheritable Class SingletonSerializationHelper
Implements IObjectReference
' This object has no fields (although it could).
' GetRealObject is called after this object is deserialized.
Public Function GetRealObject(ByVal context As StreamingContext) As Object Implements IObjectReference.GetRealObject
' When deserialiing this object, return a reference to
' the Singleton object instead.
Return Singleton.GetSingleton()
End Function
End Class
Class App
<STAThread()> Shared Sub Main()
Dim fs As New FileStream("DataFile.dat", FileMode.Create)
Try
' Construct a BinaryFormatter and use it
' to serialize the data to the stream.
Dim formatter As New BinaryFormatter
' Create an array with multiple elements refering to
' the one Singleton object.
Dim a1() As Singleton = {Singleton.GetSingleton(), Singleton.GetSingleton()}
' This displays "True".
Console.WriteLine("Do both array elements refer to the same object? " & _
Object.ReferenceEquals(a1(0), a1(1)))
' Serialize the array elements.
formatter.Serialize(fs, a1)
' Deserialize the array elements.
fs.Position = 0
Dim a2() As Singleton = DirectCast(formatter.Deserialize(fs), Singleton())
' This displays "True".
Console.WriteLine("Do both array elements refer to the same object? " & _
Object.ReferenceEquals(a2(0), a2(1)))
' This displays "True".
Console.WriteLine("Do all array elements refer to the same object? " & _
Object.ReferenceEquals(a1(0), a2(0)))
Catch e As SerializationException
Console.WriteLine("Failed to serialize. Reason: " & e.Message)
Throw
Finally
fs.Close()
End Try
End Sub
End Class
[C#]
using System;
using System.IO;
using System.Collections;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
// There should be only one instance of this type per AppDomain.
[Serializable]
public sealed class Singleton : ISerializable
{
// This is the one instance of this type.
private static readonly Singleton theOneObject = new Singleton();
// Here are the instance fields.
public String someString;
public Int32 someNumber;
// Private constructor allowing this type to construct the Singleton.
private Singleton()
{
// Do whatever is necessary to initialize the Singleton.
someString = "This is a string field";
someNumber = 123;
}
// A method returning a reference to the Singleton.
public static Singleton GetSingleton()
{
return theOneObject;
}
// A method called when serializing a Singleton.
void ISerializable.GetObjectData(
SerializationInfo info, StreamingContext context)
{
// Instead of serializing this object,
// serialize a SingletonSerializationHelp instead.
info.SetType(typeof(SingletonSerializationHelper));
// No other values need to be added.
}
// Note: ISerializable's special constructor is not necessary
// because it is never called.
}
[Serializable]
internal sealed class SingletonSerializationHelper : IObjectReference
{
// This object has no fields (although it could).
// GetRealObject is called after this object is deserialized.
public Object GetRealObject(StreamingContext context)
{
// When deserialiing this object, return a reference to
// the Singleton object instead.
return Singleton.GetSingleton();
}
}
class App
{
[STAThread]
static void Main()
{
FileStream fs = new FileStream("DataFile.dat", FileMode.Create);
try
{
// Construct a BinaryFormatter and use it
// to serialize the data to the stream.
BinaryFormatter formatter = new BinaryFormatter();
// Create an array with multiple elements refering to
// the one Singleton object.
Singleton[] a1 = { Singleton.GetSingleton(), Singleton.GetSingleton() };
// This displays "True".
Console.WriteLine(
"Do both array elements refer to the same object? " +
(a1[0] == a1[1]));
// Serialize the array elements.
formatter.Serialize(fs, a1);
// Deserialize the array elements.
fs.Position = 0;
Singleton[] a2 = (Singleton[]) formatter.Deserialize(fs);
// This displays "True".
Console.WriteLine("Do both array elements refer to the same object? "
+ (a2[0] == a2[1]));
// This displays "True".
Console.WriteLine("Do all array elements refer to the same object? "
+ (a1[0] == a2[0]));
}
catch (SerializationException e)
{
Console.WriteLine("Failed to serialize. Reason: " + e.Message);
throw;
}
finally
{
fs.Close();
}
}
}
[C++]
#using <mscorlib.dll>
using namespace System;
using namespace System::IO;
using namespace System::Collections;
using namespace System::Runtime::Serialization::Formatters::Binary;
using namespace System::Runtime::Serialization;
private __sealed __gc class SingletonSerializationHelper;
// There should be only one instance of this type per AppDomain.
[Serializable]
public __sealed __gc class Singleton : public ISerializable
{
// This is the one instance of this type.
private:
static Singleton* theOneObject = new Singleton();
// Here are the instance fields.
public:
String* someString;
Int32 someNumber;
// Private constructor allowing this type to construct the singleton.
private:
Singleton()
{
// Do whatever is necessary to initialize the singleton.
someString = S"This is a String* field";
someNumber = 123;
}
// A method returning a reference to the singleton.
public:
static Singleton* GetSingleton()
{
return theOneObject;
}
// A method called when serializing a Singleton.
void GetObjectData(SerializationInfo* info, StreamingContext context)
{
// Instead of serializing this Object*, we will
// serialize a SingletonSerializationHelp instead.
info->SetType(__typeof(SingletonSerializationHelper));
// No other values need to be added.
}
// NOTE: ISerializable*'s special constructor is NOT necessary
// because it's never called
};
[Serializable]
private __sealed __gc class SingletonSerializationHelper : public IObjectReference
{
// This Object* has no fields (although it could).
// GetRealObject is called after this Object* is deserialized
public:
Object* GetRealObject(StreamingContext context)
{
// When deserialiing this Object*, return a reference to
// the singleton Object* instead.
return Singleton::GetSingleton();
}
};
[STAThread]
int main()
{
FileStream* fs = new FileStream(S"DataFile.dat", FileMode::Create);
try
{
// Construct a BinaryFormatter and use it
// to serialize the data to the stream.
BinaryFormatter* formatter = new BinaryFormatter();
// Create an array with multiple elements refering to
// the one Singleton Object*.
Singleton* a1[] = { Singleton::GetSingleton(), Singleton::GetSingleton() };
// This displays S"True".
Console::WriteLine(S"Do both array elements refer to the same Object? {0}", __box((a1->Item[0] == a1->Item[1])));
// Serialize the array elements.
formatter->Serialize(fs, a1);
// Deserialize the array elements.
fs->Position = 0;
Singleton* a2[] = (Singleton* __gc[]) formatter->Deserialize(fs);
// This displays S"True".
Console::WriteLine(S"Do both array elements refer to the same Object? {0}", __box((a2->Item[0] == a2->Item[1])));
// This displays S"True".
Console::WriteLine(S"Do all array elements refer to the same Object? {0}", __box((a1->Item[0] == a2->Item[0])));
}
catch (SerializationException* e)
{
Console::WriteLine(S"Failed to serialize. Reason: {0}", e->Message);
throw;
}
__finally
{
fs->Close();
}
return 0;
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
名前空間: System.Runtime.Serialization
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
アセンブリ: Mscorlib (Mscorlib.dll 内)
参照
ISerializable メンバ | System.Runtime.Serialization 名前空間 | XML シリアル化および SOAP シリアル化 | RemotingSurrogateSelector | シリアル化のカスタマイズ