設定の保存の仕方いろいろ その2

XMLに保存

こいつが本命?どうも.NETではXMLへの保存が推奨されているらしい。

  • System.Xml.Serialization.XMLSerializer
  • System.Runtime.Serialization.Formatters.Soap.SoapFormatter

というのがある。XMLSerializerはpublicなフィールドのみがシリアライズ対象となって、SoapFormatterは基本的に全てのフィールドがシリアライズされるというところらしい。


で、とりあえずXMLSerializerを使ってクラスをXML化するには

public class Vampire
{
    public string name;
    public string stand;
    public string special;
}
// シリアライズするクラスを作成
Vampire dio = new Vampire;
dio.name = "Dio Brando";
dio.stand = "The World";
dio.special = "無駄無駄無駄無駄";

//書き込み先のファイル
FileStream fs = new FileStream("Dio.xml",FileMode.Create);
//XMLSerializerでクラスをシリアライズ
XmlSerializer xmlSerial = new XmlSerializer(typeof(Vampire));
xmlSerial.Serialize(fs, dio );

で、XMLから元のクラスに復元するにはこれだけでよい

//XMLファイルからクラスを復元する
Vampire dio = (Vampire)xmlSerial.Deserialize(fs);

ちなみに書き出されるXMLはこうなる。たった数行のコードでクラスのシリアル化/復元ができてしまう。ちなみに他のオブジェクトへの参照を含んでいるクラスでも、参照先のオブジェクトがシリアル化可能なクラスであればシリアル化できる

<?xml version="1.0"?>
<Vampire xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <name>Dio Brando</name>
  <stand>The World</stand>
  <special>無駄無駄無駄無駄</special>
</Vampire>

と非常にお手軽なんだけど、欠点もある

  1. publicフィールド/プロパティ以外シリアル化できない(XMLSerializerの場合)
  2. publicな引数無しのコンストラクタのあるクラスしかシリアル化できない
  3. ArrayListの配列、Listの配列はシリアル化できない
  4. シリアライズ時にクラスのpublicフィールド/プロパティでXMLファイルに存在しないものはnullで上書きされてしまう。
  5. 配列のシリアル化も可能。しかし配列の型の派生クラスを持つ配列をシリアル化しようとすると、その配列に入りうる型をあらかじめ指定してやらないといけない(参考)


とまあ欠点をあげつらってみたけれど、これだけの自由度の高さでこのお手軽さはすばらしい。フォームの位置やサイズはIDEで簡単設定できるアプリケーション設定を使って、アプリ独自の設定内容や保存データはXMLSerializerでシリアル化するのがベストか。
しかし.NET環境のXMLへの親和性の高さはすごい。万能データバケツDataSetもRealXML/WriteXMLでXML化が簡単にできるし。


参考: