Сохранение списка или массива в настройках приложения с использованием пользовательского класса - PullRequest
1 голос
/ 25 ноября 2011

В настоящее время я использую класс настроек приложения, который можно найти в книге Адмама Нэтана 101 Приложения для Windows Phone:

    public class Setting<T>
{
    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<bool> IsAerialMapStyle = new Setting<bool>("IsAerialMapStyle", false);

}

Все работает нормально, но я не могу понять, как сохранить массив или список длины 24 в настройках приложения, используя этот метод,

У меня есть это:

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

Любая помощь будет высоко ценится!

Ответы [ 2 ]

1 голос
/ 28 августа 2013

См. Использование контрактов данных .Вам необходимо объявить тип настройки для сериализации через атрибут [DataContract] в определении класса и [DataMember] в каждом поле (которое вы хотите сохранить).Да, и вам нужен System.Runtime.Serialization.

Если вы не хотите предоставлять значения закрытых полей (значения сериализуются в XML и могут быть представлены неправильно), вы можете декорировать объявления свойств, например

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

Если в вашем классе нет свойств, которые обновляют все данные экземпляра, возможно, вам также придется украсить и эти закрытые поля.Нет необходимости украшать как общедоступное свойство, так и соответствующее закрытое поле.

О, и все типы T, которые вы оборачиваете этим классом, также должны быть сериализуемыми.Примитивные типы есть, но определяемые пользователем классы (и, возможно, некоторые типы CLR?) Не будут.

0 голосов
/ 25 ноября 2011

К сожалению, AFAIK, вы не можете сохранить его в ApplicationSettings как одну key value словарную статью.Вы можете хранить только встроенные типы данных (int, long, bool, string ..).Чтобы сохранить такой список, вам нужно будет сериализовать объект в память или использовать базу данных SQLCE для хранения значений (Mango).

...