シリアル化 (C# および Visual Basic)
シリアル化は、バイトのストリームにオブジェクトを格納したり、メモリ、データベース、またはファイルに送信するオブジェクトを変換するプロセスです。その主な目的は、必要になったときに再構築できるように、オブジェクトの状態を保存することです。その逆のプロセスは逆シリアル化と呼ばれています。
シリアル化の例については、このトピックの 関連トピックと例 を参照してください。
シリアル化のしくみ
次の図は、シリアル化のプロセス全体を示します。
オブジェクトはストリームにシリアル化されます。ストリームの中には、データのみならず、オブジェクトの型についての情報も保持されます。たとえば、バージョン、カルチャ、アセンブリ名などです。そのストリームから、データベース、ファイル、またはメモリに格納できます。
シリアル化の用途
開発者は、シリアル化を使用して、オブジェクトの状態を保存し、必要に応じて再構築できます。それにより、オブジェクトのストレージやデータ交換が実現できます。シリアル化を通じて開発者が実行できる処理には、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 がクラスのインスタンスをどのようにシリアル化または逆シリアル化するかを制御できます。
SOAP シリアル化
また、XML シリアル化を使用すると、オブジェクトを SOAP 仕様に準拠する XML ストリームにシリアル化することもできます。SOAP は、XML を使用してプロシージャ呼び出しを転送するために特別にデザインされた、XML に基づくプロトコルです。通常の XML シリアル化と同じく、属性を使用すると、XML Web サービスによって生成されるリテラル スタイルの SOAP メッセージを制御することもできます。
基本的なシリアル化とカスタムのシリアル化
シリアル化の実行方法には、基本的な方法とカスタムの方法の 2 種類があります。基本的なシリアル化では、.NET Framework を使用して、オブジェクトを自動でシリアル化します。
基本的なシリアル化
基本的なシリアル化で必要な唯一の要件は、対象のオブジェクトに SerializableAttribute 属性が適用されていることです。NonSerializedAttribute を使用すると、特定のフィールドをシリアル化の対象から除外できます。
基本的なシリアル化を使用するときには、オブジェクトのバージョン管理により問題が生じる可能性があり、その場合はカスタムのシリアル化の方が好ましいことがあります。基本的なシリアル化は、シリアル化を実行するのに最も簡単な方法ですが、そのプロセスをあまり制御できません。
シリアル化のカスタマイズ
カスタムのシリアル化では、シリアル化の対象のオブジェクトやシリアル化の方法を明確に指定できます。対象のクラスは、SerializableAttribute が適用され、ISerializable インターフェイスを実装している必要があります。
オブジェクトの逆シリアル化もカスタムの方法で行うためには、カスタム コンストラクターを使用する必要があります。
デザイナー シリアル化
デザイナー シリアル化とは、特別な形式のシリアル化で、通常は開発ツールで使用されるような種類のオブジェクト永続化が行われます。デザイナー シリアル化は、オブジェクト グラフをソース ファイルに変換するプロセスです。後でそのソース ファイルを使用して、オブジェクト グラフを復元できます。ソース ファイルには、コードやマークアップ、または SQL テーブル情報が含まれることもあります。詳細については、「デザイナーのシリアル化の概要」を参照してください。
関連トピックと例
チュートリアル: オブジェクトの永続化 (C# および Visual Basic)
シリアル化を使ってインスタンス間でオブジェクトのデータを永続化する方法を紹介します。これにより、値を格納し、オブジェクトが次にインスタンス化されたときにその値を取得できます。方法: XML ファイルからオブジェクト データを読み込む (C# および Visual Basic)
XmlSerializer クラスを使用して XML ファイルに書き込んだオブジェクト データを読み込む方法について説明します。方法: XML ファイルにオブジェクト データを書き込む (C# および Visual Basic)
XmlSerializer クラスを使用して、クラスから XML ファイルにオブジェクトを書き込む方法について説明します。