オブジェクトの内容をファイルに保存、復元する

オブジェクトの内容をXMLファイルにして保存し、そのXMLファイルから元のオブジェクトに復元したいというケースがしばしばあると思います。 例えば、アプリの設定を保存、復元したい時などです。
これは、XmlSerializerクラス(System.Xml.Serialization名前空間)を使うと簡単です。 XMLファイルに書き込む時はSerializeメソッドを使い、読み込む時はDeserializeメソッドを使います。

サンプル

※ 例外処理などは省略していますので注意してください。

■ シリアライズ対象のクラス定義
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.ComponentModel;

[XmlRoot("MyClass")]
public class MyClass
{
    public int id;
    public string name;
      :
      :
}
■ シリアライズ
MyClass myClass = new MyClass();
myClass.id = 1;
myClass.name = "Yamada";
  :
  :
FileStream outputStream = new FileStream(outputFilePath, FileMode.Create);
StreamWriter writer = new StreamWriter(outputStream, System.Text.Encoding.UTF8);
XmlSerializerNamespaces outputNameSpace = new XmlSerializerNamespaces();
outputNameSpace.Add(String.Empty, String.Empty);
XmlSerializer outputSerializer = new XmlSerializer(typeof(MyClass));
outputSerializer.Serialize(writer, myClass, outputNameSpace);
writer.Flush();
writer.Close();
writer.Dispose();
outputStream.Dispose();
上記のコードで、下記のXMLファイルが生成されます。
<?xml version="1.0" encoding="utf-8"?>
<MyClass>
  <id>1</id>
  <name>Yamada</name>
</MyClass>
■ デシリアライズ
XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
FileStream inputStream = new FileStream(inputFilePath, FileMode.Open);
MyClass myClass = (MyClass)serializer.Deserialize(inputStream);
inputStream.Close();
inputStream.Dispose();

■ シリアル化を様々に制御する
対象クラスの定義に属性を付加することにより、さまざまにカスタマイズすることができます。
XmlRootルート要素を指定します。
XmlIgnore出力する必要のないメンバーを指定します。
XmlElementElementとして出力するメンバーに付与します。[XmlElement("node_name")]のように記述して、ノード名を変更できます。
DefaultValueAttributeを指定するとデフォールト値を指定できます。デフォールト値に合致するものはXMLファイルに出力されません。
XmlAttribute属性として出力するメンバーに付与します。[XmlAttribute("attr_name")]のように記述して、属性名を変更できます。
DefaultValueAttributeを指定するとデフォールト値を指定できます。デフォールト値に合致するものはXMLファイルに出力されません。
XmlArray配列を指定します。下記の使用例を参照してください。
より詳しくは、こちらを参照

使用例
[XmlRoot("MyProduct")]
public class MyProduct
{
    [XmlAttribute("ProductID")]
    public int id;
    [XmlAttribute]
    public string name;
    [XmlIgnore]
    public Image photo;
    [XmlElement("photo"), DefaultValueAttribute("")]
    public string base64EncodedPhoto;
    [XmlArray("parts"), XmlArrayItem(typeof(MyPart), ElementName = "part")]
    public List parts;
}

public class MyPart
{
    [XmlAttribute]
    public int partId;
    [XmlAttribute, DefaultValueAttribute("")]
    public string partName;
}
上記のクラス定義で、以下のようなXMLファイルが生成されます。
<?xml version="1.0" encoding="utf-8"?>
<MyProduct ProductID="1023" name="PC">
  <photo>iVBORw0KGgoAAAANSEAmYGAAAHF4H+EBgoqfAAmmC………</photo>
  <parts>
    <part partId="10" partName="Monitor" />
    <part partId="11" partName="Keyboard" />
  </parts>
</MyProduct>