クラスオブジェクトのXMLファイル書込/読込(XmlSerializer)

xmlはExtensible Markup Languageの略で、タグを利用してデータとして表現します。

例えば

<?xml version="1.0" encoding="Shift_JIS" ?>
<User>
    <ID>1</ID>
    <Name>Charlotte</Name>
    <Age>20</Age>
    <Gender>Female</Gender>
</User>

この場合Userは、IDとNameとAgeとGenderという情報を持っているということになります。

サンプルデータ

今回、設定情報が格納されているクラスオブジェクトを作成しました。

設定クラス

XMLとして出力しない場合は、[System.Xml.Serialization.XmlIgnore]属性を付けます。
注意点としてはクラスはpublicで宣言する必要があります。

public class ConfigClass
{
    public string StrValue { get; set; } = "";  //文字列情報
    public int NumValue { get; set; } = 0;      //数値情報
    public int[] ArrayValue { get; set; }       //配列情報

    [System.Xml.Serialization.XmlIgnore] 
    public string HiddenValue { get; set; }     //出力しない情報
}

オブジェクト作成

private ConfigClass _config = new ConfigClass();

データ設定

//設定
_config.StrValue = "文字情報";
_config.NumValue = 9999;
_config.ArrayValue = new int[] {1, 9, 34, 332, 764};
_config.HiddenValue = "出力しない情報";

XmlSerializerを使って、XMLを書き込む

StreamWriterを使いファイル出力します。

//出力先を取得
string output_path = "";
using (SaveFileDialog dlg = new SaveFileDialog())
{
    dlg.Filter = @"XML(*.xml)|*.xml";

    if (dlg.ShowDialog() != DialogResult.OK)
    {
        //OK以外は処理を抜ける
        return;
    }

    output_path = dlg.FileName;
}

//XmlSerializerオブジェクトを作成
System.Xml.Serialization.XmlSerializer serializer =  new System.Xml.Serialization.XmlSerializer(typeof(ConfigClass));

//UTF-8 BOM無しで書き込む
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(output_path, false, new System.Text.UTF8Encoding(false)))
{
    //シリアル化を行い、XMLファイルを出力する
    serializer.Serialize(sw, _config);

    //ファイルを閉じる
    sw.Close();
}

実行結果

以下のようなXMLが出力されました。

<?xml version="1.0" encoding="utf-8"?>
<ConfigClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <StrValue>文字情報</StrValue>
  <NumValue>9999</NumValue>
  <ArrayValue>
    <int>1</int>
    <int>9</int>
    <int>34</int>
    <int>332</int>
    <int>764</int>
  </ArrayValue>
</ConfigClass>

XmlSerializerを使って、XMLを読み込む

XMLファイルをStreamReaderで読み込みます。

//XMLファイルを取得
string input_path = "";
using (OpenFileDialog dlg = new OpenFileDialog())
{
    dlg.Filter = @"XML(*.xml)|*.xml";

    if (dlg.ShowDialog() != DialogResult.OK)
    {
        //OK以外は処理を抜ける
        return;
    }

    input_path = dlg.FileName;
}

//XmlSerializerオブジェクトを作成
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ConfigClass));

//UTF-8 BOM無しで書き込む
using (System.IO.StreamReader sr = new System.IO.StreamReader(input_path,new System.Text.UTF8Encoding(false)))
{
    //シリアル化を行い、XMLファイルを出力する
    _config = serializer.Deserialize(sr) as ConfigClass;

    //ファイルを閉じる
    sr.Close();
}

実行結果

読込むXMLファイル

<?xml version="1.0" encoding="utf-8"?>
<ConfigClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <StrValue>読込文字情報</StrValue>
  <NumValue>1234</NumValue>
  <ArrayValue>
    <int>9</int>
    <int>11</int>
    <int>5</int>
    <int>4</int>
    <int>76</int>
  </ArrayValue>
</ConfigClass>

読込後の変数「_config 」の中身

List化されたオブジェクトのXMLファイル書込/読込

List化されたオブジェクトのXMLファイル書込

例えばリスト化されたユーザーオブジェクト(List<UserClass>)をXML出力する場合は、出力typeを合わせてあげればよいです。以下に例を表示します。

配列で出力したい場合も同様にtypeof(UserClass[])とすればできます。

//XmlSerializerオブジェクトを作成
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<UserClass>));

//UTF-8 BOM無しで書き込む
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(output_path, false, new System.Text.UTF8Encoding(false)))
{
    //シリアル化を行い、XMLファイルを出力する
    serializer.Serialize(sw, _user_list);

    //ファイルを閉じる
    sw.Close();
}

出力結果

List化されたオブジェクトのXMLファイル読込

書込み時と同様にtypeを合わせます。

List<UserClass> user_list;

//XmlSerializerオブジェクトを作成
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<UserClass>));

//UTF-8 BOM無しで書き込む
using (System.IO.StreamReader sr = new System.IO.StreamReader(input_path, new System.Text.UTF8Encoding(false)))
{
    //シリアル化を行い、XMLファイルを出力する
    user_list = serializer.Deserialize(sr) as List<UserClass>;

    //ファイルを閉じる
    sr.Close();
}

読込結果

まとめ

今回はクラスオブジェクトをそのままXMLとして出力し、そのまま読み込むことができました。
とても便利です。

この方法、私はユーザーごとに設定が違う場合に利用しています。例えばインターネットを使うアプリでプロキシ情報を保存/読込するなどです。

この記事が皆様のお役に立てれば幸いです。

コメント

タイトルとURLをコピーしました