XMLシリアライズ

というわけでオブジェクトをXMLシリアライズする方法.
System.Xml.Serialization.XmlSerializer を使う.

まず,シリアライズするオブジェクトは以下の通り.
Contributionオブジェクト内にさらにUserオブジェクトがある構造.


///
/// 投稿を表すクラスです
///

public class Contribution
{
public int msgId; //投稿ID
public User user; //投稿者
public string message; //投稿内容
public Contribution()
{
}
public Contribution(User user, string message, int msgId)
{
this.msgId = msgId;
this.user = user;
this.message = message;
}
}

///


/// 投稿者を表すクラスです
///

public class User
{
public int id; //ユーザID
public string name; //ユーザ名
public string pass; //ユーザパスワード
public User()
{
}
public User(int id, string name, string pass)
{
this.id = id;
this.name = name;
this.pass = pass;
}
}

そして,このContributionオブジェクトをシリアライズするコードは以下の通り.


// XMLファイルにシリアライズ
string contributionLog = "log.txt";
Contribution contribution = new Contribution(new User(1,"Taro Yamada", "abc"), "テスト", 3);
System.Xml.Serialization.XmlSerializer serializer =
new System.Xml.Serialization.XmlSerializer(typeof(Contribution));
System.IO.FileStream fs = new System.IO.FileStream(contributionLog, System.IO.FileMode.Create);
serializer.Serialize(fs, contribution);
fs.Close();

でもって,シリアライズしたXMlファイルは以下のようになる.


3

1
Taro Yamada
abc

テスト

というわけで,ちゃんとオブジェクトの入れ子構造を反映したXMLファイルが生成される.

さて,ここで問題なのは,シリアライズの対象となる属性は,

  • オブジェクトのパブリックプロパティ
  • オブジェクトのパブリックフィールド

のいずれかであるということ.
つまり,

  • public修飾子が付いていないフィールド
  • public修飾子は付いてるけど,メソッド形式になっているもの(public get*** / public set***)

などはシリアライズの対象とならない.
そういうわけで,前項のようなGetter / Setter の話が出てきたというわけ.

パブリックフィールドをカプセル化する際は,Javaみたいなパブリックメソッドによるアクセスにするのではなく,パブリックプロパティを作ってあげないと,XMLシリアライズの対象にならないので注意.

というわけで,先の例でフィールドをカプセル化したものが,前項の例.(Contributionクラスのmessageの部分だけ抜粋)