.NET Framework でのシリアル化の基礎
更新 : 2007 年 11 月
シリアル化とは、オブジェクトをバイトのストリームに変換して、メモリ、データベース、またはファイルに保持できるようにするプロセスのことです。その主な目的は、必要になったときに再構築できるように、オブジェクトの状態を保存することです。その逆のプロセスは逆シリアル化と呼ばれています。
シリアル化のしくみ
次の図は、シリアル化のプロセス全体を示します。
オブジェクトはストリームにシリアル化されます。ストリームの中には、データのみならず、オブジェクトの型についての情報も保持されます。たとえば、バージョン、カルチャ、アセンブリ名などです。そのストリームから、データベース、ファイル、またはメモリに格納できます。
シリアル化の用途
開発者は、シリアル化を使用して、オブジェクトの状態を保存し、必要に応じて再構築できます。それにより、オブジェクトのストレージやデータ交換が実現できます。シリアル化を通じて開発者が実行できる処理には、Web サービスによりリモート アプリケーションへオブジェクトを送信する処理、あるドメインから別のドメインへオブジェクトを渡す処理、XML 文字列としてファイアウォールを越えてオブジェクトを渡す処理、セキュリティまたはユーザー固有の情報をアプリケーション間で維持する処理などがあります。
オブジェクトをシリアル化できるようにする
オブジェクトをシリアル化するために必要なのは、シリアル化する対象のオブジェクト、シリアル化したオブジェクトを格納するストリーム、および Formatter です。オブジェクトのシリアル化と逆シリアル化に必要なクラスは、System.Runtime.Serialization に備わっています。
型のインスタンスがシリアル化できるということを示すためには、その型に SerializableAttribute 属性を適用します。シリアル化しようとした型が SerializableAttribute 属性を持たない場合には、SerializationException 例外がスローされます。
クラス内の特定のフィールドをシリアル化できないようにするには、NonSerializedAttribute 属性を適用します。シリアル化できる型の中に、ポインタやハンドルなど特定の環境に固有のデータ構造を格納するフィールドがあり、そのフィールドを別の環境で意味ある形に再構築できない場合は、そのフィールドはシリアル化できないようにすることをお勧めします。
シリアル化するクラスの中に、SerializableAttribute が指定されている他のクラスのオブジェクトへの参照が格納されている場合、それらのオブジェクトもシリアル化されます。
バイナリ シリアル化と XML シリアル化
シリアル化では、バイナリ シリアル化と XML シリアル化のいずれかを使用できます。バイナリ シリアル化では、読み取り専用のものも含めたすべてのメンバがシリアル化され、パフォーマンスは向上します。XML シリアル化では、コードの可読性が高まるのに加え、オブジェクトの共有や相互運用性を目的とした使用での柔軟性も高まります。
バイナリ シリアル化
バイナリ シリアル化とは、バイナリ エンコーディングを使用して、ストレージやソケットベースのネットワーク ストリームなどの用途のために、コンパクトにシリアル化する処理です。ファイアウォールを越えてデータを渡すのには適していませんが、データを格納するときのパフォーマンスは上です。
XML シリアル化
XML シリアル化とは、オブジェクトのパブリック フィールドやパブリック プロパティ、またはメソッドのパラメータや戻り値を、特定の XML スキーマ定義言語 (XSD: XML Schema Definition Language) ドキュメントに準拠する XML ストリームにシリアル化する処理です。XML シリアル化では、パブリックなプロパティおよびフィールドを持つ、厳密に型指定されたクラスが、XML に変換されます。System.Xml.Serialization には、XML のシリアル化および逆シリアル化に必要なクラスが備わっています。
クラスおよびクラス メンバに属性を適用すると、XmlSerializer がクラスのインスタンスをどのようにシリアル化または逆シリアル化するかを制御できます。詳細については、「属性を使用した XML シリアル化の制御」および「XML シリアル化を制御する属性」を参照してください。
次の表は、XML シリアル化に関連するタスクの一覧です。
目的 |
参照項目 |
---|---|
オブジェクトをシリアル化する。 |
|
オブジェクトを逆シリアル化する。 |
|
クラスおよび XML スキーマ ドキュメントを生成する。 |
|
XML 要素および XML 属性名を修飾する。 |
|
XML ストリームの代替要素名を指定する。 |
|
派生クラスのシリアル化を制御する。 |
SOAP シリアル化
また、XML シリアル化を使用すると、オブジェクトを SOAP 仕様に準拠する XML ストリームにシリアル化することもできます。SOAP は、XML を使用してプロシージャ呼び出しを転送するために特別にデザインされた、XML に基づくプロトコルです。通常の XML シリアル化と同じく、属性を使用すると、XML Web サービスによって生成されるリテラル スタイルの SOAP メッセージを制御することもできます。詳細については、「XML Web サービスを使用した XML シリアル化」および「エンコード済み SOAP シリアル化を制御する属性」を参照してください。
次の表は、SOAP エンコード済み XML シリアル化に関連するタスクの一覧です。
目的 |
参照項目 |
---|---|
オブジェクトを SOAP エンコード済み XML ストリームとしてシリアル化する。 |
|
SOAP エンコード済み XML シリアル化をオーバーライドする。 |
基本的なシリアル化とカスタムのシリアル化
シリアル化の実行方法には、基本的な方法とカスタムの方法の 2 種類があります。基本的なシリアル化では、.NET Framework を使用して、オブジェクトを自動でシリアル化します。
基本的なシリアル化
基本的なシリアル化で必要な唯一の要件は、対象のオブジェクトに SerializableAttribute 属性が適用されていることです。NonSerializedAttribute を使用すると、特定のフィールドをシリアル化の対象から除外できます。
基本的なシリアル化を使用するときには、オブジェクトのバージョン管理により問題が生じる可能性があり、その場合はカスタムのシリアル化の方が好ましいことがあります。基本的なシリアル化は、シリアル化を実行するのに最も簡単な方法ですが、そのプロセスをあまり制御できません。
シリアル化のカスタマイズ
カスタムのシリアル化では、シリアル化の対象のオブジェクトやシリアル化の方法を明確に指定できます。対象のクラスは、SerializableAttribute が適用され、ISerializable インターフェイスを実装している必要があります。
オブジェクトの逆シリアル化もカスタムの方法で行うためには、カスタム コンストラクタを使用する必要があります。
デザイナ シリアル化
デザイナ シリアル化とは、特別な形式のシリアル化で、通常は開発ツールで使用されるような種類のオブジェクト永続化が行われます。デザイナ シリアル化は、オブジェクト グラフをソース ファイルに変換するプロセスです。後でそのソース ファイルを使用して、オブジェクト グラフを復元できます。ソース ファイルには、コードやマークアップ、または SQL テーブル情報が含まれることもあります。詳細については、「デザイナのシリアル化の概要」を参照してください。