シリアル化 (C#)Serialization (C#)

シリアル化は、オブジェクトを格納するか、メモリ、データベース、またはファイルに転送するためにバイト ストリームに変換するプロセスです。Serialization is the process of converting an object into a stream of bytes to store the object or transmit it to memory, a database, or a file. その主な目的は、必要なときに再作成できるように、オブジェクトの状態を保存しておくことです。Its main purpose is to save the state of an object in order to be able to recreate it when needed. 逆のプロセスは、逆シリアル化と呼ばれます。The reverse process is called deserialization.

シリアル化のしくみHow serialization works

この図は、シリアル化の全体的なプロセスを示しています。This illustration shows the overall process of serialization.

シリアル化グラフィックSerialization Graphic

オブジェクトは、データだけでなく、バージョン、カルチャ、アセンブリ名などのオブジェクトの型に関する情報も伝達するストリームにシリアル化されます。The object is serialized to a stream, which carries not just the data, but information about the object's type, such as its version, culture, and assembly name. そのストリームから、オブジェクトをデータベース、ファイル、またはメモリに格納できます。From that stream, it can be stored in a database, a file, or memory.

シリアル化の使用方法Uses for serialization

開発者は、シリアル化を使用して、オブジェクトの状態を保存し、必要に応じて、オブジェクトのストレージとデータ交換を指定することで、オブジェクトを再作成することができます。Serialization allows the developer to save the state of an object and recreate it as needed, providing storage of objects as well as data exchange. シリアル化を通じて、開発者は、Web サービスによるリモート アプリケーションへのオブジェクトの送信、ドメイン間のオブジェクトの受け渡し、XML 文字列としてのオブジェクトのファイアウォールの通過、アプリケーション間でのセキュリティまたはユーザー固有情報の維持などの操作を実行できます。Through serialization, a developer can perform actions like sending the object to a remote application by means of a Web Service, passing an object from one domain to another, passing an object through a firewall as an XML string, or maintaining security or user-specific information across applications.

オブジェクトをシリアル化可能にするMaking an object serializable

オブジェクトをシリアル化するには、シリアル化するオブジェクト、シリアル化したオブジェクトを格納するストリーム、および Formatter が必要です。To serialize an object, you need the object to be serialized, a stream to contain the serialized object, and a Formatter. System.Runtime.Serialization には、オブジェクトのシリアル化と逆シリアル化に必要なクラスが含まれます。System.Runtime.Serialization contains the classes necessary for serializing and deserializing objects.

この型のインスタンスをシリアル化できることを示すには、SerializableAttribute 属性を適用します。Apply the SerializableAttribute attribute to a type to indicate that instances of this type can be serialized. 型に SerializableAttribute 属性が適用されていない状態でシリアル化しようとすると、例外がスローされます。An exception is thrown if you attempt to serialize but the type doesn't have the SerializableAttribute attribute.

クラス内のフィールドをシリアル化しない場合は、NonSerializedAttribute 属性を適用します。If you don't want a field within your class to be serializable, apply the NonSerializedAttribute attribute. シリアル化できる型のフィールドに、特定の環境に固有のポインター、ハンドル、その他のデータ構造が含まれているときに、そのフィールドを別の環境で意味があるように再構成できない場合は、シリアル化不可にすることができます。If a field of a serializable type contains a pointer, a handle, or some other data structure that is specific to a particular environment, and the field cannot be meaningfully reconstituted in a different environment, then you may want to make it nonserializable.

シリアル化されたクラスに、SerializableAttribute とマークされている他のクラスのオブジェクトへの参照が含まれている場合は、これらのオブジェクトもシリアル化されます。If a serialized class contains references to objects of other classes that are marked SerializableAttribute, those objects will also be serialized.

バイナリ シリアル化と XML シリアル化Binary and XML serialization

バイナリまたは XML シリアル化を使用することができます。You can use binary or XML serialization. バイナリ シリアル化では、読み取り専用メンバーも含め、すべてのメンバーがシリアル化され、パフォーマンスが向上します。In binary serialization, all members, even members that are read-only, are serialized, and performance is enhanced. XML シリアル化では、コードの読みやすさだけではなく、オブジェクトの共有と相互運用を行うための柔軟性が増加します。XML serialization provides more readable code, and greater flexibility of object sharing and usage for interoperability purposes.

バイナリ シリアル化Binary serialization

バイナリ シリアル化では、バイナリ エンコードを使用して、ストレージやソケット ベースのネットワーク ストリームなどのためのコンパクトなシリアル化を生成します。Binary serialization uses binary encoding to produce compact serialization for uses such as storage or socket-based network streams.

XML シリアル化XML serialization

XML シリアル化では、オブジェクトのパブリック フィールドやパブリック プロパティ、またはメソッドのパラメーターや戻り値を、特定の XML スキーマ定義言語 (XSD) ドキュメントに準拠する XML ストリームにシリアル化します。XML serialization serializes the public fields and properties of an object, or the parameters and return values of methods, into an XML stream that conforms to a specific XML Schema definition language (XSD) document. XML シリアル化では、XML に変換されるパブリック プロパティとパブリック フィールドによって厳密に型指定されたクラスが生成されます。XML serialization results in strongly typed classes with public properties and fields that are converted to XML. System.Xml.Serialization には、XML のシリアル化と逆シリアル化に必要なクラスが含まれます。System.Xml.Serialization contains the classes necessary for serializing and deserializing XML.

属性をクラスおよびクラス メンバーに適用すると、XmlSerializer がそのクラスのインスタンスをシリアル化または逆シリアル化する方法を制御できます。You apply attributes to classes and class members to control the way the XmlSerializer serializes or deserializes an instance of the class.

基本的なシリアル化とカスタムのシリアル化Basic and custom serialization

シリアル化は、2 つの方法で実行できます (基本およびカスタム)。Serialization can be performed in two ways, basic and custom. 基本的なシリアル化では、.NET Framework を使用して、オブジェクトが自動的にシリアル化されます。Basic serialization uses the .NET Framework to automatically serialize the object.

基本的なシリアル化Basic serialization

基本的なシリアル化の唯一の要件は、オブジェクトに SerializableAttribute 属性が適用されていることです。The only requirement in basic serialization is that the object has the SerializableAttribute attribute applied. NonSerializedAttribute を使用して、特定のフィールドがシリアル化されないようにすることができます。The NonSerializedAttribute can be used to keep specific fields from being serialized.

基本的なシリアル化を使用する場合、オブジェクトのバージョン管理によって問題が発生する場合があります。When you use basic serialization, the versioning of objects may create problems. バージョン管理の問題が重要な場合は、カスタムのシリアル化を使用します。You would use custom serialization when versioning issues are important. 基本的なシリアル化は、シリアル化を実行する最も簡単な方法ですが、プロセスを細かく制御することはできません。Basic serialization is the easiest way to perform serialization, but it does not provide much control over the process.

カスタムのシリアル化Custom serialization

カスタムのシリアル化では、シリアル化するオブジェクトとシリアル化の方法を正確を指定できます。In custom serialization, you can specify exactly which objects will be serialized and how it will be done. クラスを SerializableAttribute でマークし、ISerializable インターフェイスを実装する必要があります。The class must be marked SerializableAttribute and implement the ISerializable interface.

カスタムの方法でオブジェクトを逆シリアル化する場合は、カスタム コンストラクターを使用する必要があります。If you want your object to be deserialized in a custom manner as well, you must use a custom constructor.

デザイナーのシリアル化Designer serialization

デザイナーのシリアル化はシリアル化の特殊な形式であり、開発ツールに関連付けられているオブジェクトの永続性の種類を含みます。Designer serialization is a special form of serialization that involves the kind of object persistence associated with development tools. デザイナーのシリアル化は、後でオブジェクト グラフを復元できるように、オブジェクト グラフをソース ファイルに変換するプロセスです。Designer serialization is the process of converting an object graph into a source file that can later be used to recover the object graph. ソース ファイルには、コードとマークアップを含めることができますが、SQL テーブル情報を含めることもできます。A source file can contain code, markup, or even SQL table information.

関連トピックと例Related Topics and Examples

チュートリアル: オブジェクトの永続化 (Visual Studio) (C#)Walkthrough: Persisting an Object in Visual Studio (C#)
シリアル化によってインスタンス間でオブジェクトのデータを永続化して値を保存しておき、次にそのオブジェクトをインスタンス化するときにその値を取得する方法を示します。Demonstrates how serialization can be used to persist an object's data between instances, allowing you to store values and retrieve them the next time the object is instantiated.

方法: XML ファイルからオブジェクト データを読み込む (C#)How to: Read Object Data from an XML File (C#)
XmlSerializer クラスを使用して、XML ファイルに以前に書き込まれたオブジェクト データを読み込む方法を示します。Shows how to read object data that was previously written to an XML file using the XmlSerializer class.

方法: XML ファイルにオブジェクト データを書き込む (C#)How to: Write Object Data to an XML File (C#)
XmlSerializer クラスを使用して、クラスから XML ファイルにオブジェクトを書き込む方法を示します。Shows how to write the object from a class to an XML file using the XmlSerializer class.