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の部分だけ抜粋)