カスタムクラスを使用してアプリケーションセットにリストまたは配列を保存する

私は現在、admam nathanの本にあるアプリケーション設定クラスを使用しています。101 Windows Phone Apps:

    public class Setting
{
    string name;
    T value;
    T defaultValue;
    bool hasValue;

    public Setting(string name, T defaultValue)
    {
        this.name = name;
        this.defaultValue = defaultValue;
    }

    public T Value
    {
        get
        {
            //checked for cached value
            if (!this.hasValue)
            {
                //try to get value from isolated storage
                if (!IsolatedStorageSettings.ApplicationSettings.TryGetValue(this.name, out this.value))
                {
                    //not set yet
                    this.value = this.defaultValue;
                    IsolatedStorageSettings.ApplicationSettings[this.name] = this.value;
                }

                this.hasValue = true;
            }

            return this.value;
        }

        set
        {
            //save value to isolated storage
            IsolatedStorageSettings.ApplicationSettings[this.name] = value;
            this.value = value;
            this.hasValue = true;
        }
    }

    public T DefaultValue
    {
        get { return this.defaultValue; }
    }

    //clear cached value;
    public void ForceRefresh()
    {
        this.hasValue = false;
    }
}

そして、別のクラスで:

public static class Settings     {         //設定メニューのユーザー設定

    public static readonly Setting IsAerialMapStyle = new Setting("IsAerialMapStyle", false);

}

それはすべて正常に動作しますが、私はこのメソッドを使用してアプリケーションの設定に配列や長さのリストを保存する方法を考えることができません。

私はこれまでこれを持っています:

  public static readonly Setting> ListOpened = new Setting>("ListOpened",....

どんな助けでも大歓迎です!

1

2 答え

データ契約の使用を参照してください。 クラス定義の[DataContract]属性と保存したい各フィールドの[DataMember]属性を使用して、設定タイプを直列化可能に宣言する必要があります。ああ、System.Runtime.Serializationが必要です。

プライベートフィールドの値を公開したくない場合(値はXMLにシリアル化され、不適切に公開される可能性があります)、プロパティの宣言を飾ることができます。

using System.Runtime.Serialization;
. . .
[DataContract]
public class Settings {
    string Name;
    . . .
    [DataMember]
    public T Value {
    . . .
    }

クラスにすべてのインスタンスデータを更新するプロパティがない場合は、それらのプライベートフィールドも修飾する必要があります。パブリックプロパティとそれに対応するプライベートフィールドの両方を飾る必要はありません。

ああ、このクラスをラップするすべての型Tも直列化可能でなければならない。プリミティブ型はありますが、ユーザー定義のクラス(およびいくつかのCLR型?)はそうではありません。

1
追加された

残念ながら、AFAIKでは ApplicationSettings キー値の辞書エントリとして保存することはできません。組み込みのデータ型(int、long、bool、string ..)のみを格納できます。このようなリストを保存するには、オブジェクトをメモリにシリアル化するか、SQLCEデータベースを使用して値(マンゴー)を保存する必要があります。

0
追加された