ここではXmlSerializerを使ってシリアライズする場合の動作の制御について解説します。
なお、この文章ではXMLスキーマ定義ツールについては踏み込みません。 必要に応じて他のドキュメントを参照してください。
シリアライズ対象からの除外 (XmlIgnoreAttribute)
XmlIgnoreAttributeを使用すると、フィールドをシリアライズ対象から除外することが出来ます。 XmlSerializerではパブリックなフィールド・プロパティをシリアライズしようとしますが、シリアライズする必要の無いフィールドや実行時のみに使用されるフィールドなどは、この属性を使用することでシリアライズしないようにすることが出来ます。
以下の例では、Account.LastLoginフィールドにXmlIgnoreAttributeを付与しています。 デシリアライズ後にAccount.LastLoginフィールドの値が復元されていない点に注目してください。
クラス・フィールドのXML要素名の指定 (XmlElementAttribute, XmlTypeAttribute, XmlRootAttribute)
XmlElementAttributeのElementNameを指定することで、シリアライズの際に出力されるフィールドのXML要素の名前を指定することが出来ます。 この属性を指定しない場合は、フィールド名が要素名のデフォルトとして使用されます。
また、XmlTypeAttributeのTypeNameもしくはXmlRootAttributeのElementNameを指定することで、型のXML要素の名前を指定することが出来ます。 この属性を指定しない場合は、型名が要素名のデフォルトとして使用されます。 XmlRootAttributeとXmlTypeAttributeの違いは、XmlRootAttributeは型がルート要素となったときの要素名を指定するのに対し、XmlTypeAttributeは型がルート要素となるかどうかに関わらず要素名を指定するという点です。 なお、これらのプロパティはいずれも、名前付きパラメータとして指定することも属性のコンストラクタで指定することも出来ます。
以下の例では、AccountクラスにXmlRootAttribute、Account.NameフィールドとLastLoginフィールドにXmlElementAttributeを付与しています。 シリアライザが出力するXMLファイルの要素名が指定した名前に変わっている点に注目してください。
クラス・フィールドのXML名前空間の指定 (XmlElementAttribute, XmlTypeAttribute, XmlRootAttribute)
XML要素名の他に、XmlElementAttribute.Namespace、XmlTypeAttribute.Namespace、XmlRootAttribute.Namespaceを指定することで、シリアライズの際に出力されるXML要素の名前空間を指定することが出来ます。 これらのプロパティはコンストラクタでは指定出来ないため、いずれも名前付きパラメータとして指定する必要があります。 また、これらの属性で指定した名前空間のプレフィックスを制御するには、XmlSerializerNamespacesを使用します。 名前空間のプレフィックスは、XmlSerializer.SerializeメソッドにXmlSerializerNamespacesを指定することで有効になります。
以下の例では、Accountクラスに対して上記の属性を付与し、シリアライズの際のXML名前空間を指定しています。 先の例とは異なり、Listに格納したAccountをシリアライズするため、XmlRootAttributeではなくXmlTypeAttributeを指定しています。 また、XmlSerializerNamespacesを使って名前空間のプレフィックスを指定しています。 シリアライザが出力するXMLファイルの各要素の名前空間が指定した値に変わっている点に注目してください。
フィールドを属性としてシリアライズする (XmlAttributeAttribute)
フィールドに対してXmlAttributeAttributeを指定することで、そのフィールドをXML属性として出力させるようにすることが出来ます。 コンストラクタ・パラメータで指定しなかった場合はデフォルトでフィールド名が属性名となります。 また、Namespaceプロパティを指定することで属性の名前空間を指定することも出来ます。
以下の例では、Account.IDフィールドに対して上記の属性を付与し、シリアライズの際に属性として出力するようにし、また同時に属性の名前も指定しています。 シリアライザが出力するXMLファイルにおいて、Account.IDフィールドの値が属性として出力されている点に注目してください。
出力フォーマットの設定 (XmlWriter + XmlWriterSettings)
XmlSerializerクラスとXmlWriterクラス・XmlWriterSettingsクラスを組み合わせることにより、シリアライズ時に出力されるXMLのフォーマットを変更することができます。 XmlWriterSettingsでは、インデントの有無や改行処理などを細かく設定できるようになっています。
以下の例では、インデントにタブを用いるようにし、また属性を改行して出力するようにXmlWriterSettingsを設定してシリアライズしています。
XmlWriterSettingsで設定できる内容についてより詳しくはXmlWriterSettingsで解説しています。
その他のシリアライズ動作の制御
XmlSerializerでもISerializableを使ったシリアライズ動作の制御を行うことが出来ます。 詳しくはISerializableの解説を参照してください。
また、ここまでで解説した以外にもシリアライズのための属性が存在します。 詳しくは以下のドキュメントを参照してください。