エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

XmlSerializer クラス

2013/12/12

オブジェクトから XML ドキュメントへのシリアル化および XML ドキュメントからオブジェクトへの逆シリアル化を行います。XmlSerializer により、オブジェクトを XML にエンコードする方法を制御できます。

System.Object
  System.Xml.Serialization.XmlSerializer

Namespace:  System.Xml.Serialization
アセンブリ:  System.Xml.Serialization (System.Xml.Serialization.dll 内)

public class XmlSerializer

XmlSerializer 型で公開されるメンバーは以下のとおりです。

  名前説明
プロテクト メソッドXmlSerializer()インフラストラクチャ。 XmlSerializer クラスの新しいインスタンスを初期化します。
パブリック メソッドXmlSerializer(Type)指定した型のオブジェクトを XML ドキュメントにシリアル化したり、XML ドキュメントを指定した型のオブジェクトに逆シリアル化したりできる、XmlSerializer クラスの新しいインスタンスを初期化します。
パブリック メソッドXmlSerializer(XmlTypeMapping)ある型を別の型にマッピングするオブジェクトを指定して、XmlSerializer クラスのインスタンスを初期化します。
パブリック メソッドXmlSerializer(Type, String)指定した型のオブジェクトを XML ドキュメントにシリアル化したり、XML ドキュメントを指定した型のオブジェクトに逆シリアル化したりできる、XmlSerializer クラスの新しいインスタンスを初期化します。すべての XML 要素の既定の名前空間を指定します。
パブリック メソッドXmlSerializer(Type, Type[])指定した型のオブジェクトを XML ドキュメントにシリアル化したり、XML ドキュメントを指定した型のオブジェクトに逆シリアル化したりできる、XmlSerializer クラスの新しいインスタンスを初期化します。プロパティまたはフィールドが配列を返す場合、extraTypes パラメーターには、その配列に挿入できるオブジェクトを指定します。
パブリック メソッドXmlSerializer(Type, XmlAttributeOverrides)指定した型のオブジェクトを XML ドキュメントにシリアル化したり、XML ドキュメントを指定した型のオブジェクトに逆シリアル化したりできる、XmlSerializer クラスの新しいインスタンスを初期化します。シリアル化される各オブジェクトはそれ自体がクラスのインスタンスを含むことができ、それをこのオーバーロードによって他のクラスでオーバーライドできます。
パブリック メソッドXmlSerializer(Type, XmlRootAttribute)指定した型のオブジェクトを XML ドキュメントにシリアル化したり、XML ドキュメントを指定した型のオブジェクトに逆シリアル化したりできる、XmlSerializer クラスの新しいインスタンスを初期化します。また、XML ルート要素として使用するクラスを指定します。
パブリック メソッドXmlSerializer(Type, XmlAttributeOverrides, Type[], XmlRootAttribute, String)Object 型のオブジェクトを XML ドキュメント インスタンスにシリアル化したり、XML ドキュメント インスタンスを Object 型のオブジェクトに逆シリアル化したりできる、XmlSerializer クラスの新しいインスタンスを初期化します。シリアル化される各オブジェクトはそれ自体がクラスのインスタンスを含むことができ、それをこのオーバーロードによって他のクラスでオーバーライドします。このオーバーロードでは、すべての XML 要素の既定の名前空間、および XML ルート要素として使用するクラスも指定します。
このページのトップへ

  名前説明
パブリック メソッドCanDeserializeこの XmlSerializer が、指定された XML ドキュメントを逆シリアル化できるかどうかを示す値を取得します。
パブリック メソッドDeserialize(Stream)指定した Stream に格納されている XML ドキュメントを逆シリアル化します。
パブリック メソッドDeserialize(TextReader)指定した TextReader に格納されている XML ドキュメントを逆シリアル化します。
パブリック メソッドDeserialize(XmlReader)指定した XmlReader に格納されている XML ドキュメントを逆シリアル化します。
パブリック メソッドEquals(Object)指定した Object が、現在の Object と等しいかどうかを判断します。 (Object から継承されます。)
プロテクト メソッドFinalizeObject がガベージ コレクションで再利用される前に、Object がリソースを解放して他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。)
パブリック メソッド静的メンバーFromMappings(XmlMapping[])インフラストラクチャ。 XmlTypeMapping オブジェクトの配列から作成された、XmlSerializer オブジェクトの配列を返します。
パブリック メソッド静的メンバーFromMappings(XmlMapping[], Type)インフラストラクチャ。 指定した割り当てから XmlSerializer クラスのインスタンスを返します。
パブリック メソッド静的メンバーFromTypes型の配列から作成された、XmlSerializer オブジェクトの配列を返します。
パブリック メソッドGetHashCode特定の型のハッシュ関数として機能します。 (Object から継承されます。)
パブリック メソッドGetType現在のインスタンスの Type を取得します。 (Object から継承されます。)
プロテクト メソッドMemberwiseClone現在の Object の簡易コピーを作成します。 (Object から継承されます。)
パブリック メソッドSerialize(Stream, Object)指定した Object をシリアル化し、生成された XML ドキュメントを、指定した Stream を使用してファイルに書き込みます。
パブリック メソッドSerialize(TextWriter, Object)指定した Object をシリアル化し、生成された XML ドキュメントを、指定した TextWriter を使用してファイルに書き込みます。
パブリック メソッドSerialize(XmlWriter, Object)指定した Object をシリアル化し、生成された XML ドキュメントを、指定した XmlWriter を使用してファイルに書き込みます。
パブリック メソッドSerialize(Stream, Object, XmlSerializerNamespaces)指定した Object をシリアル化し、指定した名前空間を参照する、指定した Stream を使用して、生成された XML ドキュメントをファイルに書き込みます。
パブリック メソッドSerialize(TextWriter, Object, XmlSerializerNamespaces)指定した Object をシリアル化し、指定した名前空間を参照する、指定した TextWriter を使用して、生成された XML ドキュメントをファイルに書き込みます。
パブリック メソッドSerialize(XmlWriter, Object, XmlSerializerNamespaces)指定した Object をシリアル化し、指定した名前空間を参照する、指定した XmlWriter を使用して、生成された XML ドキュメントをファイルに書き込みます。
パブリック メソッドToString現在のオブジェクトを表す文字列を返します。 (Object から継承されます。)
このページのトップへ

XML シリアル化とは、オブジェクトのパブリック プロパティとパブリック フィールドを格納または転送できるようにシリアル形式 (この場合は XML) に変換する処理のことです。逆シリアル化とは、その XML 出力から元の状態のオブジェクトを作り直すことです。シリアル化はオブジェクトの状態をストリームまたはバッファーに保存しておく方法の 1 つと考えることができます。

オブジェクトのデータは、クラス、フィールド、プロパティ、プリミティブ型、配列などのプログラミング言語の構成要素、および埋め込まれている XML を使用して記述されます。

オブジェクトと XML の間でデータを転送するには、プログラミング言語の構成要素から XML スキーマへのマッピングと、XML スキーマからプログラミング言語の構成要素へのマッピングが必要です。XmlSerializer は、設計時および実行時にこれら 2 つの技術の間の処理を受け持ちます。

生成される XML の制御

生成された XML を制御するために、クラスやそのメンバーに特別な属性を適用できます。たとえば、異なる XML 要素名を指定するには、パブリック フィールドやパブリック プロパティに XmlElementAttribute を適用し、ElementName プロパティを設定します。IXmlSerializable インターフェイスを実装して、XML 出力を制御することもできます。

生成される XML が、W3C (World Wide Web Consortium) (www.w3.org) のドキュメント『Simple Object Access Protocol (SOAP) 1.1』のセクション 5 に準拠している必要がある場合は、XmlTypeMapping を使用して XmlSerializer を構築します。

XmlSerializer を使用すると、厳密に型指定されているクラスを操作できると同時に、XML の柔軟性をも活用できます。フィールドまたはプロパティを使用すると、XML ドキュメントの一部を XML オブジェクトに直接読み込むことができます。

拡張可能な XML スキーマを使用する場合、XmlAnyElementAttribute 属性や XmlAnyAttributeAttribute 属性を使用して、元のスキーマには存在しない要素や属性をシリアル化および逆シリアル化することもできます。オブジェクトを使用するには、オブジェクトの配列を返すフィールドに XmlAnyElementAttribute を適用するか、オブジェクトの配列を返すフィールドに XmlAnyAttributeAttribute を適用します。

プロパティまたはフィールドが複合オブジェクト (配列、クラス インスタンスなど) を返す場合、XmlSerializer は、これらのオブジェクトをメイン XML ドキュメント内で入れ子にされた要素に変換します。たとえば、次のコードの最初のクラスは、2 番目のクラスのインスタンスを返します。

public class MyClass
{
    public MyObject MyObjectProperty;
}
public class MyObject
{
    public string ObjectName;
}

シリアル化された XML 出力は、次のコードのようになります。

<MyClass>
  <MyObjectProperty>
  <ObjectName>My String</ObjectName>
  </MyObjectProperty>
</MyClass>

スキーマに省略可能な要素 (minOccurs = '0') または既定値が含まれる場合は、特殊なパターンを使用して、XmlSerializer によって認識されるブール値フィールドを作成し、そのフィールドに XmlIgnoreAttribute を適用します。このパターンは propertyNameSpecified の形式で作成されます。たとえば、"MyFirstName" という名前のフィールドがある場合は、"MyFirstNameSpecified" というフィールドも作成して、"MyFirstName" という XML 要素を生成するかどうかを XmlSerializer に指示します。これを次の例に示します。

public class OptionalOrder
{
    // This field should not be serialized 
    // if it is uninitialized.
    public string FirstOrder;

    // Use the XmlIgnoreAttribute to ignore the 
    // special field named "FirstOrderSpecified".
    [System.Xml.Serialization.XmlIgnoreAttribute]
    public bool FirstOrderSpecified;
}

既定のシリアル化のオーバーライド

また、オブジェクトとそのフィールドおよびプロパティのセットに対するシリアル化をオーバーライドすることもでき、そのためには、適切な属性の 1 つを作成し、その属性を XmlAttributes クラスのインスタンスに追加します。この方法でシリアル化をオーバーライドすることには 2 つの利点があります。第 1 に、ソースにアクセスしなくても、DLL 内のオブジェクトのシリアル化の制御および強化ができます。第 2 に、シリアル化できるクラスを 1 セット作成し、オブジェクトを複数の方法でシリアル化できます。詳細については、XmlAttributeOverrides クラスのトピックを参照してください。

オブジェクトをシリアル化するには、Serialize メソッドを呼び出します。オブジェクトを逆シリアル化するには、Deserialize メソッドを呼び出します。

XML ドキュメントに XML 名前空間を追加する方法については、XmlSerializerNamespaces のトピックを参照してください。

メモメモ:

XmlSerializer は、IEnumerable または ICollection を実装するクラスを特別に処理します。IEnumerable を実装するクラスは、1 つのパラメーターを受け取るパブリックな Add メソッドを実装している必要があります。Add メソッドのパラメーターは、GetEnumerator から返された値の Current プロパティから返された型と同じ型か、またはその型の基本型の 1 つである必要があります。IEnumerable に加えて ICollection を実装しているクラスは、整数を受け取るパブリックな Item インデックス付きプロパティ (C# のインデクサー) および整数型のパブリックな Count プロパティを持っている必要があります。Add メソッドのパラメーターは、Item プロパティから返された型か、その型の基本型の 1 つと同じ型であることが必要です。ICollection を実装するクラスの場合、シリアル化する値は GetEnumerator を呼び出して取得するのではなく、インデックス付き Item プロパティから取得します。

オブジェクトを逆シリアル化するには、一時ディレクトリ (TEMP 環境変数で定義) に書き込むためのアクセス許可が必要です。

動的に生成されるアセンブリ

パフォーマンスを向上するために、XML シリアル化インフラストラクチャでは、指定した型のシリアル化と逆シリアル化を行うアセンブリが動的に生成されます。それらのアセンブリはインフラストラクチャによって検索および再利用されます。この動作は、次のコンストラクターを使用するときにだけ発生します。

他のコンストラクターを使用すると、同じアセンブリの複数のバージョンが生成され、アンロードされません。その結果、メモリ リークが発生し、パフォーマンスも低下します。最も簡単な解決方法は、上で挙げた 2 つのコンストラクターのいずれかを使用することです。

ArrayList およびジェネリック リストのシリアル化

次のようなデータについては、XmlSerializer でシリアル化または逆シリアル化することはできません。

符号なし長整数型の列挙体のシリアル化

次の条件にあてはまる場合、XmlSerializer をインスタンス化して列挙体をシリアル化することはできません。列挙体の型が符号なし長整数型 (C# の ulong) で、その列挙体に 9,223,372,036,854,775,807 を超える値のメンバーが格納されている場合。たとえば、次のコードはシリアル化できません。

public enum LargeNumbers: ulong
{
    a = 9223372036854775808
}
// At runtime, the following code will fail.
xmlSerializer mySerializer=new XmlSerializer(typeof(LargeNumbers));

Obsolete 属性でマークされ、シリアル化されなくなったオブジェクト

.NET Framework 3.5 では、XmlSerializer クラスは [Obsolete] としてマークされているオブジェクトをシリアル化しません。

バージョンについてのメモ

Windows Phone

 XElement 型のオブジェクトの XML シリアル化を使用する場合、追加の XElement タグが XML コンテンツの先頭と末尾に追加されます。

Windows Phone OS

サポート: 8.0, 7.1, 7.0

この型は、スレッド セーフです。

表示:
© 2015 Microsoft