XML シリアル化の概要Introducing XML Serialization

シリアル化とは、転送できる形式にオブジェクトを変換するプロセスのことです。Serialization is the process of converting an object into a form that can be readily transported. たとえば、オブジェクトをシリアル化し、HTTP を使用してインターネット経由でクライアントとサーバー間で転送できます。For example, you can serialize an object and transport it over the Internet using HTTP between a client and a server. 一方、逆シリアル化とは、ストリームから元のオブジェクトを再構築する処理です。On the other end, deserialization reconstructs the object from the stream.

XML シリアル化では、オブジェクトのパブリック フィールドとプロパティ値のみを XML ストリームにシリアル化します。XML serialization serializes only the public fields and property values of an object into an XML stream. 型情報は対象に含まれません。XML serialization does not include type information. たとえば、Library 名前空間に Book オブジェクトがある場合、逆シリアル化時に、ストリームから同じ型のオブジェクトが再構築されるという保証はありません。For example, if you have a Book object that exists in the Library namespace, there is no guarantee that it is deserialized into an object of the same type.

注意

XML シリアル化では、メソッド、インデクサー、プライベート フィールド、または読み取り専用プロパティ (読み取り専用コレクションを除く) は変換されません。XML serialization does not convert methods, indexers, private fields, or read-only properties (except read-only collections). オブジェクトのフィールドとプロパティをすべてシリアル化するには、パブリックとプライベートのいずれの場合も、XML シリアル化ではなく、DataContractSerializer を使用します。To serialize all an object's fields and properties, both public and private, use the DataContractSerializer instead of XML serialization.

XML シリアル化の中核となるクラスは XmlSerializer クラスです。このクラスの最も重要なメソッドは、Serialize メソッドと Deserialize メソッドです。The central class in XML serialization is the XmlSerializer class, and the most important methods in this class are the Serialize and Deserialize methods. XmlSerializer は、C# ファイルを作成し、これを .dll ファイルにコンパイルすることによってシリアル化を行います。The XmlSerializer creates C# files and compiles them into .dll files to perform this serialization. .NET Framework 2.0 では、こうしたシリアル化アセンブリをあらかじめ生成してアプリケーションと共に配置し、起動時のパフォーマンスを向上させるため、XML シリアライザー ジェネレーター ツール (Sgen.exe) が用意されています。In .NET Framework 2.0, the XML Serializer Generator Tool (Sgen.exe) is designed to generate these serialization assemblies in advance to be deployed with your application and improve startup performance. によって生成される XML ストリーム、 XmlSerializer World Wide Web Consortium (W3C) に準拠してXML スキーマ定義言語 (XSD) 1.0 勧告します。The XML stream generated by the XmlSerializer is compliant with the World Wide Web Consortium (W3C) XML Schema definition language (XSD) 1.0 recommendation. 生成されたデータ型は、ドキュメント 『 準拠している、さらに、"XML Schema Part 2。データ型。"Furthermore, the data types generated are compliant with the document titled "XML Schema Part 2: Datatypes."

オブジェクトのデータは、クラス、フィールド、プロパティ、プリミティブ型、配列などのプログラミング構成要素、および XmlElement オブジェクトまたは XmlAttribute オブジェクトの形で埋め込まれている XML を使用して記述されます。The data in your objects is described using programming language constructs like classes, fields, properties, primitive types, arrays, and even embedded XML in the form of XmlElement or XmlAttribute objects. 属性で注釈を付けて独自のクラスを作成するか、または XML スキーマ定義ツールを使用して、既存の XML スキーマに基づいたクラスを生成できます。You have the option of creating your own classes, annotated with attributes, or using the XML Schema Definition tool to generate the classes based on an existing XML Schema.

XML スキーマがある場合は、XML スキーマ定義ツールを実行して、そのスキーマに厳密に型指定された一連のクラスを生成し、属性を使用して注釈を付けることができます。If you have an XML Schema, you can run the XML Schema Definition tool to produce a set of classes that are strongly typed to the schema and annotated with attributes. このようなクラスのインスタンスをシリアル化すると、元の XML スキーマに準拠した XML が生成されます。When an instance of such a class is serialized, the generated XML adheres to the XML Schema. このようなクラスを用意することにより、操作が簡単なオブジェクト モデルを使用してプログラミングできると同時に、生成される XML も確実に XML スキーマに準拠したものになります。Provided with such a class, you can program against an easily manipulated object model while being assured that the generated XML conforms to the XML schema. .NET Framework の他のクラス (XmlReader クラス、XmlWriter クラスなど) を使用する代わりに、この方法を使用して XML ストリームの解析や書き込みを実行できます。This is an alternative to using other classes in the .NET Framework, such as the XmlReader and XmlWriter classes, to parse and write an XML stream. 詳細については、「XML ドキュメントと XML データ」を参照してください。For more information, see XML Documents and Data. これらのクラスを使用すると、任意の XML ストリームを解析できます。These classes allow you to parse any XML stream. これに対し、既知の XML スキーマに準拠した XML ストリームが求められる場合には、XmlSerializer を使用します。In contrast, use the XmlSerializer when the XML stream is expected to conform to a known XML Schema.

属性を使用して XML ストリームの XML 名前空間、要素名、属性名などを設定することで、XmlSerializer クラスによって生成される XML ストリームを制御できます。Attributes control the XML stream generated by the XmlSerializer class, allowing you to set the XML namespace, element name, attribute name, and so on, of the XML stream. これらの属性、および属性による XML シリアル化の制御方法については、「属性を使用した XML シリアル化の制御」を参照してください。For more information about these attributes and how they control XML serialization, see Controlling XML Serialization Using Attributes. また、生成される XML を制御するこれらの属性の一覧については、「XML シリアル化を制御する属性」を参照してください。For a table of those attributes that are used to control the generated XML, see Attributes That Control XML Serialization.

さらに、XmlSerializer クラスでは、オブジェクトをシリアル化し、エンコードされた SOAP XML ストリームを生成することができます。The XmlSerializer class can further serialize an object and generate an encoded SOAP XML stream. このようにして生成される XML は、W3C のドキュメント『Simple Object Access Protocol (SOAP) 1.1』のセクション 5 に準拠します。The generated XML adheres to section 5 of the World Wide Web Consortium document titled "Simple Object Access Protocol (SOAP) 1.1." このプロセスの詳細については、次を参照してください。方法。Serialize an Object as SOAP エンコード済み XML Streamします。For more information about this process, see How to: Serialize an Object as a SOAP-Encoded XML Stream. 生成される XML を制御する属性の一覧については、「エンコード済み SOAP シリアル化を制御する属性」を参照してください。For a table of the attributes that control the generated XML, see Attributes That Control Encoded SOAP Serialization.

XmlSerializer クラスは、XML Web サービスによって作成され、XML Web サービスに渡される SOAP メッセージを生成します。The XmlSerializer class generates the SOAP messages created by, and passed to, XML Web services. この SOAP メッセージを制御するには、XML Web サービス ファイル (.asmx) 内のクラス、戻り値、パラメーター、およびフィールドに属性を適用します。To control the SOAP messages, you can apply attributes to the classes, return values, parameters, and fields found in an XML Web service file (.asmx). XML Web サービスでは、リテラルまたはエンコード済みのいずれの SOAP スタイルも使用できるため、「XML シリアル化を制御する属性」と「エンコード済み SOAP シリアル化を制御する属性」の両方に示されている属性を使用できます。You can use both the attributes listed in "Attributes That Control XML Serialization" and "Attributes That Control Encoded SOAP Serialization" because an XML Web service can use either the literal or encoded SOAP style. XML Web サービスによって生成された XML を属性を使用して制御する方法については、「XML Web サービスを使用した XML シリアル化」を参照してください。For more information about using attributes to control the XML generated by an XML Web service, see XML Serialization with XML Web Services. SOAP と XML Web サービスの詳細については、次を参照してください。 SOAP メッセージの書式設定をカスタマイズするします。For more information about SOAP and XML Web services, see Customizing SOAP Message Formatting.

XmlSerializer アプリケーションのセキュリティに関する考慮事項Security Considerations for XmlSerializer Applications

XmlSerializer を使用するアプリケーションを作成するときには、次の項目とその関連事項に注意する必要があります。When creating an application that uses the XmlSerializer, you should be aware of the following items and their implications:

  • XmlSerializer は、TEMP 環境変数で指定されたディレクトリ内に C# ファイル (.cs) を作成し、これらを .dll ファイルにコンパイルします。シリアル化はこれらの DLL で行われます。The XmlSerializer creates C# (.cs) files and compiles them into .dll files in the directory named by the TEMP environment variable; serialization occurs with those DLLs.

    注意

    SGen.exe ツールを使用すると、このシリアル化アセンブリを事前に生成して署名することができます。These serialization assemblies can be generated in advance and signed by using the SGen.exe tool. これは、サーバー側の Web サービスに対しては機能せず、This does not work a server of Web services. クライアント側での手動シリアル化にのみ使用できます。In other words, it is only for client use and for manual serialization.

    作成時とコンパイル時、このコードと DLL には悪意のあるプロセスに対する脆弱性があります。The code and the DLLs are vulnerable to a malicious process at the time of creation and compilation. Microsoft Windows NT 4.0 以降を実行しているコンピューターでは、複数のユーザーが一時ディレクトリを共有する可能性があります。When using a computer running Microsoft Windows NT 4.0 or later, it might be possible for two or more users to share the TEMP directory. 2 つのアカウントが異なるセキュリティ特権を持ち、高い特権を持つアカウントが XmlSerializer を使用してアプリケーションを実行する場合、一時ディレクトリの共有は危険です。Sharing a TEMP directory is dangerous if the two accounts have different security privileges and the higher-privilege account runs an application using the XmlSerializer. この場合、一方のユーザーが .cs ファイルまたはコンパイルされた .dll ファイルのいずれかを置き換えることにより、コンピューターのセキュリティが侵害される可能性があります。In this case, one user can breach the computer's security by replacing either the .cs or .dll file that is compiled. これを防ぐためには、コンピューター上の各アカウントが常に固有のプロファイルを持つようにしてください。To eliminate this concern, always be sure that each account on the computer has its own profile. 既定では、TEMP 環境変数はアカウントごとに異なるディレクトリを示します。By default, the TEMP environment variable points to a different directory for each account.

  • 悪意のあるユーザーが XML データの連続ストリームを Web サーバーに送り続けた場合 (サービス拒否攻撃)、XmlSerializer はコンピューターがリソース不足に陥るまでデータの処理を続行します。If a malicious user sends a continuous stream of XML data to a Web server (a denial of service attack), then the XmlSerializer continues to process the data until the computer runs low on resources.

    インターネット インフォメーション サービス (IIS) を実行しているコンピューターを使用し、IIS 内でアプリケーションを実行することによって、この種の攻撃を防ぐことができます。This kind of attack is eliminated if you are using a computer running Internet Information Services (IIS), and your application is running within IIS. IIS には、一定量 (既定では 4 KB) を超える長さのストリームを処理しないゲート機能があります。IIS features a gate that does not process streams longer than a set amount (the default is 4 KB). IIS を使用しないアプリケーションを作成し、XmlSerializer による逆シリアル化を行う場合は、同様のゲート機能を実装してサービス拒否攻撃を防ぐ必要があります。If you create an application that does not use IIS and deserializes with the XmlSerializer, you should implement a similar gate that prevents a denial of service attack.

  • XmlSerializer はデータをシリアル化し、指定された任意の型を使用してすべてのコードを実行します。The XmlSerializer serializes data and runs any code using any type given to it.

    悪意のあるオブジェクトが脅威を与える方法には、次の 2 とおりがあります。There are two ways in which a malicious object presents a threat. 悪意のあるコードを実行する方法と、XmlSerializer によって作成された C# ファイルに悪意のあるコードを挿入する方法です。It could run malicious code or it could inject malicious code into the C# file created by the XmlSerializer. 最初のケースでは、悪意のあるオブジェクトが破壊的なプロシージャを実行しようとしたときに、コード アクセス セキュリティによって実行が防止され、被害を防ぐことができます。In the first case, if a malicious object tries to run a destructive procedure, code access security helps prevent any damage from being done. 2 番目のケースでは、XmlSerializer によって作成された C# ファイルに、悪意のあるオブジェクトがなんらかの方法でコードを挿入する可能性が論理的にあります。In the second case, there is a theoretical possibility that a malicious object may somehow inject code into the C# file created by the XmlSerializer. この問題は十分に調査されており、このような攻撃を受ける可能性は低いと考えられますが、不明または信頼されていない型のデータは絶対にシリアル化しないことが重要です。Although this issue has been examined thoroughly, and such an attack is considered unlikely, you should take the precaution of never serializing data with an unknown and untrusted type.

  • 機密情報をシリアル化すると脆弱性が生じる可能性があります。Serialized sensitive data might be vulnerable.

    後に、 XmlSerializerデータがシリアル化やその他のデータ ストアの XML ファイルとして保存できます。After the XmlSerializer has serialized data, it can be stored as an XML file or other data store. このデータ ストアが他のプロセスからも利用できたり、イントラネットまたはインターネットで表示できたりする場合、データの盗用や悪用の可能性が生じます。If your data store is available to other processes, or is visible on an intranet or the Internet, the data can be stolen and used maliciously. たとえば、クレジット カード番号を含む注文をシリアル化するアプリケーションを作成すると、データは非常に脆弱になります。For example, if you create an application that serializes orders that include credit card numbers, the data is highly sensitive. これを避けるには、データ ストアを常に保護し、機密を保つための処置が必要です。To help prevent this, always protect the store for your data and take steps to keep it private.

単純なクラスのシリアル化Serialization of a Simple Class

パブリック フィールドを持つ基本クラスのコード例を次に示します。The following code example shows a basic class with a public field.

Public Class OrderForm
    Public OrderDate As DateTime
End Class
public class OrderForm
{
    public DateTime OrderDate;
}

このクラスのインスタンスをシリアル化すると、次のようなストリームが生成されます。When an instance of this class is serialized, it might resemble the following.

<OrderForm>
    <OrderDate>12/12/01</OrderDate>
</OrderForm>

シリアル化の例については、「XML シリアル化の例」を参照してください。For more examples of serialization, see Examples of XML Serialization.

シリアル化できる項目Items That Can Be Serialized

XmLSerializer クラスを使用して、次の項目をシリアル化できます。The following items can be serialized using the XmLSerializer class:

  • パブリックな読み取り/書き込みプロパティとパブリック クラスのフィールドPublic read/write properties and fields of public classes.

  • ICollection または IEnumerable を実装するクラス。Classes that implement ICollection or IEnumerable.

    注意

    パブリック プロパティではなく、コレクションのみがシリアル化されます。Only collections are serialized, not public properties.

  • XmlElement オブジェクト。XmlElement objects.

  • XmlNode オブジェクト。XmlNode objects.

  • DataSet オブジェクト。DataSet objects.

シリアル化またはオブジェクトを逆シリアル化の詳細については、次を参照してください。方法。オブジェクトをシリアル化方法。オブジェクトを逆シリアル化します。For more information about serializing or deserializing objects, see How to: Serialize an Object and How to: Deserialize an Object.

XML シリアル化を使用する利点Advantages of Using XML Serialization

XmlSerializerクラスで完全かつ柔軟に制御できますオブジェクトを XML としてシリアル化する場合。The XmlSerializer class gives you complete and flexible control when you serialize an object as XML. XML Web サービスを作成する場合は、シリアル化を制御する属性をクラスやメンバーに適用して、XML 出力を特定のスキーマに準拠させることができます。If you are creating an XML Web service, you can apply attributes that control serialization to classes and members to ensure that the XML output conforms to a specific schema.

たとえば、XmlSerializer を使用すると、次のことができます。For example, XmlSerializer enables you to:

  • フィールドやプロパティを属性または要素としてエンコードするかどうかSpecify whether a field or property should be encoded as an attribute or an element.

  • 使用する XML 名前空間Specify an XML namespace to use.

  • 要素または属性の名前 (フィールド名やプロパティ名が適切ではない場合)Specify the name of an element or attribute if a field or property name is inappropriate.

XML シリアル化のもう 1 つの利点は、生成される XML ストリームが特定のスキーマに準拠している限りは、開発するアプリケーションに制約が課されないことです。Another advantage of XML serialization is that you have no constraints on the applications you develop, as long as the XML stream that is generated conforms to a given schema. たとえば、書籍の説明に使用するスキーマがあるとします。Imagine a schema that is used to describe books. このスキーマでは、書籍名、著者、出版社、ISBN 番号などの要素を扱います。It features a title, author, publisher, and ISBN number element. 書籍発注や在庫管理など、この XML データを任意の方法で処理するアプリケーションを開発できます。You can develop an application that processes the XML data in any way you want, for example, as a book order, or as an inventory of books. いずれの場合も、指定された XML スキーマ定義言語 (XSD) スキーマに XML ストリームが準拠していることが唯一の要件です。In either case, the only requirement is that the XML stream conforms to the specified XML Schema definition language (XSD) schema.

XML シリアル化に関する考慮事項XML Serialization Considerations

XmlSerializer クラスを使用する場合には、次の点を考慮する必要があります。The following should be considered when using the XmlSerializer class:

  • Sgen.exe ツールは、特に、シリアル化アセンブリを生成して最適なパフォーマンスを実現するように設計されています。The Sgen.exe tool is expressly designed to generate serialization assemblies for optimum performance.

  • シリアル化されたデータには、データ自体とクラスの構造のみが含まれます。The serialized data contains only the data itself and the structure of your classes. 型の ID やアセンブリの情報は含まれません。Type identity and assembly information are not included.

  • シリアル化できるのは、パブリック プロパティとパブリック フィールドのみです。Only public properties and fields can be serialized. プロパティにパブリック アクセサー (get メソッドおよび set メソッド) が存在する必要があります。Properties must have public accessors (get and set methods). 非パブリック データをシリアル化する必要がある場合は、XML シリアル化ではなく DataContractSerializer クラスを使用します。If you must serialize non-public data, use the DataContractSerializer class rather than XML serialization.

  • クラスにはシリアル化するパラメーターなしのコンス トラクターが必要XmlSerializerします。A class must have a parameterless constructor to be serialized by XmlSerializer.

  • メソッドはシリアル化できません。Methods cannot be serialized.

  • IEnumerable または ICollection を異なる方法で実装しているクラスは、次のような特定の要件を満たしていれば、XmlSerializer で処理できます。XmlSerializer can process classes that implement IEnumerable or ICollection differently if they meet certain requirements, as follows.

    IEnumerable を実装するクラスは、単一のパラメーターを受け取るパブリックな Add メソッドを実装している必要があります。A class that implements IEnumerable must implement a public Add method that takes a single parameter. Add メソッドのパラメーターは、GetEnumerator メソッドによって返される IEnumerator.Current プロパティから返される型と一致している (ポリモーフィックである) 必要があります。The Add method's parameter must be consistent (polymorphic) with the type returned from the IEnumerator.Current property returned from the GetEnumerator method.

    IEnumerable の他に ICollection も実装するクラス (CollectionBase など) は、整数を受け取るパブリックなインデックス付き Item プロパティ (C# の場合はインデクサー) と、integer 型のパブリックな Count プロパティを持つ必要があります。A class that implements ICollection in addition to IEnumerable (such as CollectionBase) must have a public Item indexed property (an indexer in C#) that takes an integer and it must have a public Count property of type integer. Add メソッドに渡されるパラメーターは、Item プロパティから返された型と同じ型か、またはその型の基本型の 1 つである必要があります。The parameter passed to the Add method must be the same type as that returned from the Item property, or one of that type's bases.

    ICollection を実装するクラスの場合、シリアル化される値は、GetEnumerator を呼び出して取得されるのではなく、インデックス付き Item プロパティから取得されます。For classes that implement ICollection, values to be serialized are retrieved from the indexed Item property rather than by calling GetEnumerator. また、パブリック フィールドとパブリック プロパティは、別のコレクション クラス (ICollection を実装するクラス) を返すパブリック フィールドを除き、シリアル化されません。Also, public fields and properties are not serialized, with the exception of public fields that return another collection class (one that implements ICollection). 例については、「XML シリアル化の例」を参照してください。For an example, see Examples of XML Serialization.

XSD データ型のマッピングXSD Data Type Mapping

W3C のドキュメント 『 XML Schema Part 2。データ型XML スキーマ定義言語 (XSD) スキーマで許可されている単純なデータ型を指定します。The W3C document titled XML Schema Part 2: Datatypes specifies the simple data types that are allowed in an XML Schema definition language (XSD) schema. これらのデータ型の多く (intdecimal など) については、対応するデータ型が .NET Framework にあります。For many of these (for example, int and decimal), there is a corresponding data type in the .NET Framework. ただし、NMTOKEN データ型など、.NET Framework には対応するものがない XML データ型もあります。However, some XML data types do not have a corresponding data type in the .NET Framework (for example, the NMTOKEN data type). その場合、XML スキーマ定義ツール (XML スキーマ定義ツール (Xsd.exe)) を使用してスキーマからクラスを生成すると、適切な属性が文字列型のメンバーに適用され、その DataType プロパティが XML データ型名に設定されます。In such cases, if you use the XML Schema Definition tool (XML Schema Definition Tool (Xsd.exe)) to generate classes from a schema, an appropriate attribute is applied to a member of type string, and its DataType property is set to the XML data type name. たとえば、XML データ型が NMTOKEN である "MyToken" という名前の要素がスキーマに含まれている場合、生成されるクラスには、次の例に示すようなメンバーが含まれます。For example, if a schema contains an element named "MyToken" with the XML data type NMTOKEN, the generated class might contain a member as shown in the following example.

<XmlElement(DataType:="NMTOKEN")> _
Public MyToken As String
[XmlElement(DataType = "NMTOKEN")]
public string MyToken;

同様に、特定の XML スキーマ (XSD) に準拠する必要があるクラスを作成する場合は、そのクラスに適切な属性を適用し、DataType プロパティを必要な XML データ型名に設定する必要があります。Similarly, if you are creating a class that must conform to a specific XML Schema (XSD), you should apply the appropriate attribute and set its DataType property to the desired XML data type name.

型のマップの一覧については、次の属性クラスの DataType プロパティを参照してください。For a complete list of type mappings, see the DataType property for any of the following attribute classes:

関連項目See also