Как правильно хранить пользовательский объект в изолированном хранилище с помощью C#?

Работаю над побочным проектом с WP8, но возникли проблемы с запуском IsolatedStorage. Я просмотрел десятки сообщений, казалось бы, задающих один и тот же вопрос, но мне не удалось заставить работать какое-либо из решений. Приложение представляет собой простой органайзер задач, в котором я создал свои собственные объекты задач, одна из которых является сводной задачей, а каждая сводная задача содержит список базовых задач. Я пытался использовать XMLSerializing только для того, чтобы столкнуться с проблемами, потому что я использовал ObservableCollection. Думал, что могу изменить коллекцию на подкласс INotifyPropertyChanged, но это тоже не сработало. Откровенно говоря, я все равно еще не разобрался в различиях между ними. Так или иначе, моя последняя попытка связана с попыткой использовать параметры IsolatedStorage, и это тоже не сработало. Вот мое определение класса:

class SummaryTask : TaskItem
{
    public List<BasicTask> children = new List<BasicTask>();
    private string sumTaskName;
    private int sumTaskId;
    public SummaryTask()
    {

    }
    public SummaryTask(string name, int id)
    {
        sumTaskName = name;
        sumTaskId = id;
    }
    public string SumTaskName
    {
        get { return sumTaskName; }
        set { sumTaskName = value; }
    }
    public int SumTaskId
    {
        get { return sumTaskId; }
        set { sumTaskId = value; }
    }
    public void addTask(string taskName, string taskText, int taskId){
        children.Add(new BasicTask(taskName, taskText, taskId));
    }
    public List<BasicTask> CHILDREN
    {
        get { return children; }
    }
}
}

Я создаю список этого SummaryTask в глобальной переменной и использую его на своих страницах для легкого доступа. Вот как выглядит начало моего файла MainPage.xaml.cs ОБНОВЛЕНО:

    public MainPage()
    {
        InitializeComponent();
        BackKeyPress += OnBackKeyPressed;
        if (Global.settings.Contains("list"))
        {
            Global.list = (List<SummaryTask>)Global.settings["list"];
        }
        else
        {
            Global.list = new List<SummaryTask>();
        }
    }

Также принимаются рекомендации о низком качестве моего кода и о том, как его улучшить. Спасибо.

Изменить: исключение указывает на то, что элемент с таким же ключом уже создан. В этом случае трассировка стека не показывает ничего важного. Я также должен отметить, что исключение выдается после добавления объекта в список и попытки его сохранения, а не во время компиляции.

Фрагмент кода, который я использую, чтобы попытаться сохранить в изолированном хранилище, находится здесь, он срабатывает, когда я перехожу к MainPage.xaml:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        resultList.SelectedItem = null;
        Global.settings["list"] = Global.list;
        Global.settings.Save();
    }

Больше никаких исключений, но выход из приложения и повторный вход не извлекают сохраненные данные.


person Wilcoholic    schedule 01.12.2012    source источник
comment
Когда вы задаете вопрос, связанный с исключением, пожалуйста подробно опишите исключение. Какое сообщение? Что-нибудь интересное в трассировке стека?   -  person Jon Skeet    schedule 01.12.2012
comment
Приношу свои извинения, я добавил информацию, связанную с Exception. Кажется, я пытаюсь дважды создать одну и ту же запись IsolatedStorage. Я вижу, как это происходит, но я не знаю, как сохранить его без использования add. settings.Save() вызывает исключение безопасности.   -  person Wilcoholic    schedule 01.12.2012
comment
Подробности об этом исключении безопасности: он говорит мне, что добавление общедоступного конструктора без параметров решит проблему, но я не уверен, где он хочет, чтобы я его добавил. Он уже есть в моем классе SummaryTask, как показано выше.   -  person Wilcoholic    schedule 01.12.2012


Ответы (1)


Проблему с Add исправить очень просто — достаточно вместо этого использовать индексатор, который позволяет перезаписать запись с таким же именем:

settings["list"] = Global.list;

Это не исправит вызов Save ... но вам нужно будет предоставить более подробную информацию о том, какое исключение (не просто «оно говорит мне», а полную информацию об исключении), чтобы мы могли помочь вам больше.

person Jon Skeet    schedule 01.12.2012
comment
Сейчас я использую индексатор и больше не получаю исключение. Вызов сохранения теперь работает, поскольку он больше не генерирует исключение, но по-прежнему не сохраняет для меня никаких данных. Я обновил свой пост своим новым конструктором MainPage и методом, который я пытаюсь использовать для сохранения своих данных. - person Wilcoholic; 01.12.2012