[.NET] Configuration中のcollectionのserialization

user Configurationを使い始めたときは全部を文字列に自分でくみ上げて使っていた。
ソースコード中では文字列を区切り文字でsplitして使い、最後にconcatして収納。
この部分はobjectのserializeを使えばもっとプログラムがすっきりするのではないか、と考えた。

何も考えずにそのまま吐き出させると以下のようになってしまうので、serializeを適切にoverrideしなければならない。

   <location allowOverride="true" inheritInChildApplications="true">
        <domainSection protectedDomain="(コレクション)" />
    </location>

のようになって値が保存されなかった。CultureInfoが日本語だとカタカナでコレクションとなる、というのを発見した。

以下のようにしてsectionの中にpropertyを定義してそのまま渡せたらいいなあ、と甘いことを考えていた。

        [ConfigurationProperty("protectedDomain")]
        public ObservableCollection<string> protectedDomain
        {
            get
            {
                return (ObservableCollection<string>)this["protectedDomain"];
            }
            set
            {
                this["protectedDomain"] = value;
            }
        }

msdnを見ると、ConfigurationElement classの説明にソースコードが添付されてdeserializeをどう使うかが解説されている。
http://msdn.microsoft.com/en-us/library/system.configuration.configurationelement.aspx

ConfigurationElementCollectionを使い、collectionのserializeを行うのがポイントのようだ。collectionが単純な文字列のコレクションの場合は、この仕組みを使わずに自分で’;’でつなぐなどして複数の文字列を1つの文字列にするほうがなじみのあるやり方になる。

広告

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。