非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

C#: XMLを読み込んでクラスオブジェクトに格納する方法(逆シリアル化)

      2016/08/31

アプリケーションの設定ファイルとか簡単なデータを保持するのに、単純なテキストファイルでもいいのですが、ある程度構造化されていた方が便利です。その点、XMLファイルは都合がいいのですが、C#にはXMLファイルを読み込んでクラスオブジェクトに格納したり、逆にクラスオブジェクトをXML形式に書き込むことが簡単にできます。

今回はXMLファイルを読み込んでクラスオブジェクトに格納する方法を紹介します。(逆シリアル化といいます。)

[ad#top-1]

まず最初に完成したソースコードはこちら

今回読み込むXMLは以下の通り。データにid, name, ageがあります。


これをクラスオブジェクトに格納する方法は以下です。

 

データ格納用クラスを用意する

まず、XMLのデータ構造に対応したクラスを作る必要があります。今回のXMLはmenbersの中にmemberという複数のデータ群が存在しています。

これをクラスオブジェクトに格納する方法として、memberをMemberDataというクラスに格納し、さらに複数のMemberDataをList<MemberData>(MemberDatasクラス)に突っ込むというやり方をします。

List<MemberData>をクラスとして用意したのは後述しますが、読み込んだXMLはクラスにしか型変換できないためです。ダイレクトにList<MemberData>へ型変換しようとすると例外が発生します。

0

 

ポイントは属性による「紐付け」

XMLのデータ構造とクラスのプロパティには、関係をはっきりさせるために属性で紐づけさせなければなりません。MemberDatasクラスには以下のような属性を明示させます。

1

 

MemberDataクラスにも属性で以下のように明示させます。

2

 

逆シリアル化

XMLファイルを読み込んでクラスオブジェクトに突っ込むところは以下の4行でできます。最初は単純にXMLファイルを読み込んで、XmlSerializerオブジェクトをMemberDatasクラスで初期化したのち、3行目で逆シリアル化します。これでMemberDatas(およびその中にあるMemberData)にデータが格納されます。

5

ここでのポイントは以下のような型変換をすると実行エラーが起きます。

List<MemberDatas> members = (List<MemberDatas>) serializer.Deserialize(file);

List型にはキャストできないんです。(これに気づくまで時間かかった!) そのために、前述のとおりList型のプロパティを持つMemberDatasクラスが必要になってくるわけなんですね。

 

実行

コンパイルして実行すると以下の通りです。きちんとXMLファイルを読み込んで表示させることができました。

4

 

【関連記事】C#: クラスオブジェクトをXMLに保存する方法(シリアル化)

[ad#ad-1]

 

スポンサーリンク

 - C#応用編