読者です 読者をやめる 読者になる 読者になる

ふるすたっくえんじにあっぽい人の日記

ASP .NET MVC (C#)、.NET Framework、iOS (Objective-c) アプリ、Androidアプリ (Java)、AWS、たまにLAMPとかプロジェクトマネジメントあたりのお話

【C#】シリアライズ・デシリアライズ xml編

宣言。ぼくはwebエンジニアではありません。
今作ってるやつからかっさらってきたソースは大体晒し終わったので、やっと本題。
ここからはWindowsFormアプリケーション・コンソールアプリケーションが中心だぉ

windowsアプリで設定値保存したいときとかにxmlに保存できると便利よねって話
昔はiniファイルとか使ってたな、そういえば。。
テスターさんにiniファイルなんて難しくていじれないって苦情があったのはとある会社での出来事。

とりあえず設定値格納用のクラスー
この例ではexeの位置にsettings.xmlを出力するぉ。
あーちなみにこれコピペするとPassword平文で保存するなんてアホな処理なんでよい子はマネしないように。

    public class AppSetting
    {
        public string UserId { get; set; }
        public string Password { get; set; }

        public AppSetting()
        {
            UserId = string.Empty;
            Password = string.Empty;
        }
    }

んで、シリアライズとデシリアライズ
起動時にデシリアライズして読み込んで、終了時にシリアライズして保存。
AppSettingはrefでMainFormに渡すなりなんなり。
実際はシングルトンでManager作って、そいつが保持が妥当でしょうか。

using System;
using System.IO;
using System.Reflection;
using System.Xml.Serialization;
using System.Windows.Forms;

namespace Hoge
{
    static class Program
    {
    private const string _fileName = @"settings.xml";

        private static AppSetting _appSetting;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            // 設定値読み込み
            using (var fileStream = new FileStream(_fileName, FileMode.OpenOrCreate))
            {
                if (fileStream.Length == 0)
                    _appSetting = new AppSetting();
                else
                {
                    var serializer = new XmlSerializer(typeof(AppSetting));
                    _appSetting = (AppSetting)serializer.Deserialize(fileStream);
                }
            }

            // MainForm表示
            Application.Run(new MainForm());

            // 設定値保存
            using (var fileStream = new FileStream(_fileName, FileMode.Create))
            {
                var serializer = new XmlSerializer(typeof(AppSetting));
                serializer.Serialize(_fileName, _appSetting);
            }
        }
    }
}