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