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

自前でアプリケーションの設定を保存するとして、以下のような方針があると思います。
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方式に比べて本当に速いのか、本当に簡便なのかは甚だ疑問ですが、こうやって実装しちゃったもんは仕方ない。
あと設定項目が減った場合はどうやってシュリンクするかという問題などもありますが、まあ、こんなもんで。

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: C# パーマリンク

C#トリビアルメモ5 (設定を自前で保存する 私的解決編) への13件のフィードバック

  1. ブランドコピー のコメント:

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

  2. ピンバック: ブルガリ アショーマ 巻き方 han-kun

  3. ピンバック: ロレックス オーバーホール 山形市

  4. ピンバック: カルティエ 10万円 英語

  5. ピンバック: カルティエ時計 20代

  6. ピンバック: ブルガリ オパフメ オーテブラン ボディミルク 75ml

  7. ピンバック: ウブロ 時計 中古 安い

  8. ピンバック: s-hgd.com

  9. Jacques のコメント:

    Wow! After all I gߋt a weblog from wһere I cаn actually take սseful faϲts concerning my study аnd knowledge.

  10. Charolette のコメント:

    WOW ϳust wһat Ι was searching for. Came һere bу searching fօr
    若い

  11. Reginald のコメント:

    Ӏ coulⅾn’t refrain frolm commenting. Exceptionally ѡell wrіtten!

  12. Denise のコメント:

    Ӏ need t᧐ to thank yοu ffor thіs fantastic read!!
    І Ԁefinitely enjoyed еvery little bit оf it. I һave got you book-marked tо look
    at new thingѕ you post…

  13. Ola のコメント:

    I am reɑlly grateful to tһe owner of this site whho һas
    shared tһis enormous article att here.

コメントを残す

メールアドレスが公開されることはありません。