手軽にXMLシリアライズでファイルに保存する

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

アプリケーションを作る際にどうしても必要になってくる設定の保存を手軽に行えるように拡張するライブラリです。
XMLによる設定の保存はユーザーにとって編集しやすく、かつわかりやすいという利点を持っています。

ソースコード

using System;
using System.Collections.Generic;
using System.Text;
public static class XmlSerialize
{
    public static void SaveInXml(this object value, string filename)
    {
        System.Xml.Serialization.XmlSerializer serializer =
            new System.Xml.Serialization.XmlSerializer(value.GetType());
        using (System.IO.StreamWriter sw = new System.IO.StreamWriter(
            filename, false, new System.Text.UTF8Encoding(false)))
        {
            serializer.Serialize(sw, value);
        }
    }
    public static object LoadInXml(this Type type, string filename)
    {
        System.Xml.Serialization.XmlSerializer serializer =
            new System.Xml.Serialization.XmlSerializer(type);
        using (System.IO.StreamReader sr = new System.IO.StreamReader(
            filename, new System.Text.UTF8Encoding(false)))
        {
            return serializer.Deserialize(sr);
        }
    }
}

保存はobjectに、ロードはTypeクラスに拡張メソッドを作っています。
XmlSerializerを使ってシンプルにシリアライズをしているため、クラスのメンバーを編集した場合、正常にデシリアライズできなくなります。

使い方

まずは設定クラスを作りましょう。下はサンプル
シリアライズされるメンバーは変数か、publicなsetとgetを持っているプロパティのみです。

public class Setting
{
    public string Key1 { get; set; }
    public string Key2 { get; set; }
}

保存と読み込みは以下のような感じです。

// 設定クラスを初期化/値を入れる
Setting data = new Setting();
data.Key1 = "Test";
data.Key2 = "TestTest";
// 保存
data.SaveInXml(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\test.xml");
// 読み込み
data = typeof(Setting).LoadInXml(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\test.xml") as Setting;

ついでに上のようなコードを実行するとこのようなXMLファイルが作成されます。

<?xml version="1.0" encoding="utf-8"?>
<Setting xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Key1>Test</Key1>
  <Key2>TestTest</Key2>
</Setting>

デシリアライズはtypeofでタイプを呼び出してからデシリアライズすることになります。しかし戻り値は.NETの仕様上object型で返すことになるため、as修飾子を使って型変換しています。

ダウンロード

上記に書かれているソースコードが全文のため、ソースコードの公開は割愛します。