設定内容をファイルに保存する (XmlSerializerを利用したクラスのシリアライズ、デシリアライズ)

XmlSerializerを利用してクラスのシリアライズ、デシリアライズをするコードを紹介します。

概要

アプリケーションで設定内容を保存する処理を実装することがあります。アプリケーションの設定内容を保存する方法としてはiniファイルやレジストリ、XMLファイルに書き込むなどいくつかの保存方法があります。こちらの記事ではApplicationSettingsBaseクラスを用いた設定ファイルの保存を取り上げましたが、ApplicationSettingsBaseではファイル保存場所を変えることができないなどの制約があります。今回はXmlSerializerを利用することで、任意の場所に設定ファイルを保存できるようにします。

補足
JSON形式でのクラスのシリアライズ、デシリアライズはこちらの記事を参照してください。

実装

XmlSerializerを利用する場合は設定を格納するクラスを定義し、そのクラスのメンバ変数に設定情報を代入しXmlSerializerを用いて設定を格納したクラスをシリアライズしてファイルに書き出す仕組みとなります。

シリアライズは下記コードでクラスの内容をXMLファイルに書き出しています。

serializer.Serialize(fs, set);


一方、下記コードでXMLファイルを読み取りクラスのインスタンスを取得しています。

Setting set = (Setting)serializer.Deserialize(fs);

プログラム例

form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Serialization;
using System.IO;

namespace XMLSerializer
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      Setting set = new Setting();
      
      set.a = 100;

      string fileName = "C:\\Develop\\aaa.config";
      XmlSerializer serializer = new XmlSerializer(typeof(Setting));
      FileStream fs = new FileStream(fileName, FileMode.Create);
      serializer.Serialize(fs, set);
      //
      fs.Close();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      string fileName = "C:\\Develop\\aaa.config";
      XmlSerializer serializer = new XmlSerializer(typeof(Setting));
      FileStream fs = new FileStream(fileName, FileMode.Open);

      Setting set = (Setting)serializer.Deserialize(fs);
      fs.Close();

      textBox1.Text += Convert.ToString(set.a) + "\r\n";
    }
  }
}

Setting.cs (設定クラス)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace XMLSerializer
{
  public class Setting
  {
    public int a;
  }
}

設定クラスにクラスの配列を含めたやや複雑な例

form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Serialization;
using System.IO;

namespace XMLSerializer
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      Setting set = new Setting();
      
      set.a = 100;
      set.acclist = new ACC[2];
      set.acclist[0] = new ACC();
      set.acclist[1] = new ACC();

      set.acclist[0].name = "Penguin";
      set.acclist[1].name = "Duck";

      string fileName = "C:\\Develop\\aaa.config";
      XmlSerializer serializer = new XmlSerializer(typeof(Setting));
      FileStream fs = new FileStream(fileName, FileMode.Create);
      serializer.Serialize(fs, set);

      //
      fs.Close();
      
    }

    private void button2_Click(object sender, EventArgs e)
    {
      string fileName = "C:\\Develop\\aaa.config";
      XmlSerializer serializer = new XmlSerializer(typeof(Setting));
      FileStream fs = new FileStream(fileName, FileMode.Open);

      Setting set = (Setting)serializer.Deserialize(fs);
      fs.Close();

      textBox1.Text += Convert.ToString(set.a) + "\r\n";
      for (int i = 0; i < set.acclist.Length; i++) {
        textBox1.Text += set.acclist[i].name + "\r\n";
      }

    }
  }
}

Setting.cs (設定クラス)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace XMLSerializer
{
  public class ACC
  {
    public string name;
  }

  public class Setting
  {
    public int a;
    public ACC[] acclist;

  }
}

AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2010-06-09
Copyright © 1995–2025 iPentec all rights reserverd.