Home > C# > C#トリビアルメモ5 (設定を自前で保存する 私的解決編)

C#トリビアルメモ5 (設定を自前で保存する 私的解決編)

  • 2007-10-07 (日) 13:41
  • C#

自前でアプリケーションの設定を保存するとして、以下のような方針があると思います。
1.XMLでファイルに保存⇒XMLファイルをパースして設定を復元
2.設定クラスをシリアル化してファイルに保存⇒デシリアライズして設定を復元

デシリアライズした後は、「⇒各部品の初期化に使う」という流れです。
2の方針をとると設定項目が増えたとき、つまり設定クラスのメンバが増えたとき、古いバージョンの設定クラスをデシリアライズできなくなってしまい拡張性に乏しいところがあります。
そこで、XMLにしとけば万事OKなわけですが、XMLをいちいちパースするのも結構メンドクサイし、なんとなく遅そうって感じもします。
そういうわけで私がとった方針は下記です。
・HashTableをメンバ変数にもつ設定クラスを作成⇒HashTableをシリアライズしてファイルに保存⇒HashTableをデシリアライズして設定を復元

要約すると下記のようなクラスになります。


class MySetting
{
    private Hashtable SettingTable = null;
    private static MySetting _instance = null;

    private MySetting()
    {
        if (System.IO.File.Exists(this.FilePath))
        {
            try
            {
                BinaryFormatter serializer = new BinaryFormatter();
                System.IO.FileStream fstream = new System.IO.FileStream(this.FilePath, System.IO.FileMode.Open);
                this.SettingTable = (Hashtable)serializer.Deserialize(fstream);
                fstream.Close();
            }
            catch
            {
                this.SettingTable = new Hashtable();
            }
        }
        else
        {
            this.SettingTable = new Hashtable();
        }
        
        this.DefaultSetting();
    }

    private void DefaultSetting()
    {
        if (!this.SettingTable.ContainsKey("MyAplSize")) this.SettingTable["MyAplSize"] = new System.Drawing.Size(250, 400);
    }

    public void Save()
    {
        try
        {
            BinaryFormatter serializer = new BinaryFormatter();
            System.IO.FileStream fstream = new System.IO.FileStream(this.FilePath, System.IO.FileMode.Create);
            serializer.Serialize(fstream, this.SettingTable);
            fstream.Close();
        }
        catch
        {
        }
    }

    public static MySetting Values
    {
        get
        {
            if (_instance == null) _instance = new MySetting();
            return _instance;
        }
    }

    public System.Drawing.Size MyAplSize
    {
        get
        {
            return (System.Drawing.Size)this.SettingTable["MyAplSize"];
        }
        set { this.SettingTable["MyAplSize"] = value; }
    }
    
    private string FilePath
    {
        get
        {
            return System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\MySetting.dat";
        }
    }
}

コンストラクタでファイルを読み込み、デシリアライズします。ファイルがない場合はデフォルトの設定を適用します。
デフォルトの設定はDefaultSetting()で行い、デシリアライズしたHashTableに設定がない項目(あるいはファイルがない場合は全項目)はここで値を代入しておきます。
Save()でシリアライズして、バイナリで保存しておきます。上記例では対象アプリケーションが保存されているディレクトリの直下にMySetting.datというファイルを作成します。
設定クラスですので、いくつもこのクラスのインスタンスがあるというのも変ですから、シングルトンパターンを適用します。そのためコンストラクタはprivateにしておき、実際に各部品から設定値を読み込むには以下のようにします。


form1.Size = MySetting.Values.MyAplSize;

「Values」が唯一のインスタンスを返すgetterになっています。
各設定項目の取得はgetter,setterで行い、これがHashTableの値をラッピングしている形です。
設定項目をひとつ作るごとにgetter,setterを作成、DefaultSetting()に追加、しないといけないので面倒といえば面倒ですが、一度仕組みを作ってしまえばどうということはありません。

まあ、このやり方がXML方式に比べて本当に速いのか、本当に簡便なのかは甚だ疑問ですが、こうやって実装しちゃったもんは仕方ない。
あと設定項目が減った場合はどうやってシュリンクするかという問題などもありますが、まあ、こんなもんで。

以上

Comments:1

ブランドコピー 17-08-01 (火) 16:19

信用第一/正規取扱店≡≡≡
★★★★★大注目★★★★★≡≡≡
当店の承諾に→誠実 信用 送料無料(日本全国)
日本的な人気と信頼を得ています。
2017-2017年最新作ルイヴィトン新品、新素材入荷! !
人気唯一ブランド専門店
主要取扱商品:バッグ、財布、腕時計、ベルト、マフラー 。
ルイヴィトン、グッチ、シャネル、ブルガリ、エルメス、プラダ等海外高級ブランドがここに集結。
非常に親切で丁寧な対応で、良い品物がそろっています。
ご注文の方は、【卸売、小売など歓迎】ご連絡下さい。

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://red-treasure.com/report/wp-trackback.php?p=107
Listed below are links to weblogs that reference
C#トリビアルメモ5 (設定を自前で保存する 私的解決編) from コスミー報告書[社外秘]

Home > C# > C#トリビアルメモ5 (設定を自前で保存する 私的解決編)

Search
Feeds
Meta
 合計:009994
 今日:0047 昨日:0169

Return to page top