C#でXML Serializeによる設定ファイル管理とバージョンアップ

本記事は、[C#での設定ファイル管理とパラメータのバージョンアップ]の続きとして、XMLのSerializeとDeSerializeによる設定情報やパラメータの扱いについて記載します。XMLのSerializeとDeserializeは、設定ファイル管理において扱いやすい特徴があり多く使わています。

Ⅰ.XML Serializeを使う方法

説明で使うXMLファイル

説明で使うデータクラス

XML Serializeによる設定ファイルへ書き込み

方法1と方法2の大きな違いがなく、Steamの扱いの違いである。settingによって、書き込む条件(改行有無など)を設定するためには方法1のように設定することもできる。

方法1.ファイル作成時、FileStreamとXmlWriterで書き込む方法

方法2.ファイル作成時、FileStreamで書き込む方法

方法2だと、XML先頭に以下のヘッダが追加される。

XML DeSerializeによる設定ファイルからの読み込み

DeserializeもSerializeと同じく、方法1と方法2の違いは大きくなく、Streamの扱いが違うだけである。settingによって、読み込む条件を設定するためには方法1のように設定することもできる。

方法1.ファイル作成時、FileStreamとXmlWriterで書き込む方法

方法2.ファイル作成時、FileStreamで書き込む方法

XML SerializeとDeSerializeを呼び出す側

XML Serializeの書き込みに影響を与える属性

XML Serializeは、クラスのまま書き込みこともできますが、XML書き込み時にクラスやメンバーの構造・名称を変更せず、プロパティなどに属性を設定することで、書き込みを調整することができます。体表的な例を示します。

属性 内容
XmlRoot XMLのRootタグ名を指定します。
XmlElement XMLのタグ名(クラスのメンバー)を指定します。
XmlAttribute XMLのタグの属性(attribute)を指定します。
XmlIgnore XMLには出力しないように指定します。

属性を使ったソースコードの例です。

上記の結果は、以下のようになります。

以下にソースコードとXML出力結果の関係を示します。XMLはsrc.1.1 xmlと比較してみるともっとわかりやすくなります。

Ⅱ.XML DataContractSerializerを使う方法

XML DataContractSerializerによる設定ファイルへ書き込み

XML DataContractSerializerによる設定ファイルからの読み込み

XML DataContractSerializerの書き込みに影響を与える属性

XML DataContractSerializerも、XML書き込み時にクラスやメンバーの構造・名称を変更せず、プロパティなどに属性を設定することで、書き込みを調整することができます。体表的な例を示します。

属性 内容
DataContract XMLのRootタグ名を指定します。
Name:名称を変更します
Namespace:NameSpaceを変更、または、””指定で削除します
DataMember XMLのタグ(クラスのメンバー)を指定します。
Name:出力名称を変更します
Order:出力順番を変更します
IgnoreDataMember XMLに出力しない(除外)メンバを指定します

属性を使ったソースコードの例です。

上記の結果は、以下のようになります。

交換性に影響しないバージョン管理

以下のsrc.4.1.1 Version1からバージョンアップによって、クラスメンバー名を変更する必要がある場合は、src.4.1.2 Version2のようにDataMemberAttributeを使って、交換性を維持します。

XmlのSerializerとDataContractSerializerの使い分け

XmlのXmlSerializerとDataContractSerializerがどんな特徴があり、どのように使うべきかについて簡単にまとめます。アプリケーションの特徴(製品の特徴)によりますので、これっとは言えないので、上記の特徴を考えた上で、どちらを使うか決めると良いです。

区分 XmlSerializer DataContractSerializer
処理速度
(XmlSerializerより数十%~3倍ぐらい早いらしい)
復元のための注意点 デフォルトコンストラクタを経由する デフォルトコンストラクタを経由しない
データの順番 〇 データ順番変更可 △ データ順番変更は不可
なので、VersionUP時は注意必要
Dictionary扱い 〇 そのままではできない
他の型に変換して保存する
◎ そのままで可能

※デフォルトコンストラクタとは、引数を持たないコンストラクタのことです。

設定ファイルのバージョンアップ

おそらく、単なるクラスのメンバー追加レベルなら大きな問題はないです(DataContractは順番に注意が必要)。アプリケーションの状況によって、どうしてもバージョンアップが必要になる場合はあります。その時は、バージョンにあったクラスを定義する必要が出てしまいます。XmlSerializerとDataContractSerializerは、かなり楽ではありますが、クラスメンバーの変化が激しい場合(例えば、メンバーの意味が変わってしまったり、メンバーの型を変えないといけない場合)などは、その都度クラスをVersion毎に生成することになるので、面戸な作業になりますので、注意が必要です。なので、もし、XML Serializeを検討しているのであれば、次に紹介するJsonによるSerializeのことも検討案のひとつとして入れておくと良いです。

バージョンアップの基本的な流れについては、「設定とパラメータファイルのバージョンアップ仕組み」を参照してください。

まとめ

XMLのSerialize(XmlSerializerとDataContractSerializer)は、強力な設定ファイルの保存方法です。ただし、バージョンアップによる設定ファイルの内容が激しい場合は、検討が必要になります。

・参考サイト
もっとSerializeについて知りたい方は、以下のサイトを参考にしてください。http://neue.cc/2011/12/10_357.html