XMLシリアライズ、デシリアライズについて

XMLシリアライズとは

あるクラスの内容をXMLに書き出したり、XMLから読み込んだりすること。
クラスの内容をファイルに保存したりできる。
Webサービスにデータを渡す時も、XMLシリアライズされている。

今回やろうとしたこと

あるフォルダのXMLファイルに書き出された、あるクラスのインスタンスのデータがある。
そのファイルを読んで、中身をクラスとして復元する。

ちょっとハマったとこ

サーバー側で定義したインスタンス(データベースをモデル化したもの)に対して、
プロパティをXMLシリアライズしたい時は、以下の属性を付けないといけない。

XmlElement
単一のプロパティに付ける。
XmlArray
配列のプロパティに付ける。
public partial class MotorCycle{
    [XmlElement]
    public Engine Engine { get; set; }

    [XmlArray]
    public List<Tyre> Tyres { get; set; }
}

参考文献

Stack overflow
http://stackoverflow.com/questions/364253/how-to-deserialize-xml-document

動作するバージョンを上げるよ。XmlElementAttributeラベルとXmlElementを変更した。
理由は、StockNumberとMakeとModelの値は要素であって、属性ではないから。
あと、reader.ReadToEnd()も消した。このメソッドは、テキストを全部読んでファイルの終わりに辿りついてしまって、そこからデシリアライズのために読むことができなくなっちゃうので。
同じく、ネーミングもちょっといじらせてもらったよ:)

これがクラス定義:

[Serializable()]
public class Car
{
    [System.Xml.Serialization.XmlElement("StockNumber")]
    public string StockNumber { get; set; }

    [System.Xml.Serialization.XmlElement("Make")]
    public string Make { get; set; }

    [System.Xml.Serialization.XmlElement("Model")]
    public string Model { get; set; }
}


[Serializable()]
[System.Xml.Serialization.XmlRoot("CarCollection")]
public class CarCollection
{
    [XmlArray("Cars")]
    [XmlArrayItem("Car", typeof(Car))]
    public Car[] Car { get; set; }
}

シリアライズする部分:

#!
CarCollection cars = null;
string path = "cars.xml";

XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));

StreamReader reader = new StreamReader(path);
cars = (CarCollection)serializer.Deserialize(reader);
reader.Close();

生成されたXML:

<?xml version="1.0" encoding="utf-8"?>
<CarCollection>
<Cars>
  <Car>
    <StockNumber>1020</StockNumber>
    <Make>Nissan</Make>
    <Model>Sentra</Model>
  </Car>
  <Car>
    <StockNumber>1010</StockNumber>
    <Make>Toyota</Make>
    <Model>Corolla</Model>
  </Car>
  <Car>
    <StockNumber>1111</StockNumber>
    <Make>Honda</Make>
    <Model>Accord</Model>
  </Car>
</Cars>
</CarCollection>