Сериализация ObservableCollection - PullRequest
2 голосов
/ 05 февраля 2012

Я хочу сохранить коллекцию ObservableCollection, содержащую элементы «Number», в IsolatedStorage на телефоне. Я вызываю методы SaveHistory () и LoadHistory () моего класса FileAcces в App.xaml.cs всякий раз, когда приложение закрывается, активируется, запускается и т. Д. У меня есть глобальная переменная, определенная в App.xaml.cs, которая называется list (ObservableCollection)

При отладке я получаю сообщение об ошибке Исключение InvalidOperationException не обработано ( В XML-документе (3, 4). ) есть ошибка в строке, которая говорит

App.list = (ObservableCollection<Number>)serializer.Deserialize(stream); (в LoadHistory ())

public class FileAccess
{
    public static void SaveHistory()
    {
            using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream stream = store.CreateFile("History.xml"))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection<Number>));
                    serializer.Serialize(stream, App.list);
                }
            }
    }

    public static void LoadHistory()
    {
        using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
        {
            //Make the file if it doesn't exist.
            if (!store.FileExists("History.xml"))
            {
                IsolatedStorageFileStream file = store.CreateFile("History.xml");
                //Dispose of the stream automatically created when creating the file. 
                file.Close();
                file.Dispose();
            }
            using (IsolatedStorageFileStream stream = store.OpenFile("History.xml", System.IO.FileMode.Open))
            {
                //If the file isnt empty, then deserialize the xml into Settings objects and load them into the database.
                if (stream.Length > 0)
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection<Number>));
                    App.list = (ObservableCollection<Number>)serializer.Deserialize(stream);
                }
                else
                {
                    //If the file is empty, create a new ObservableCollection of Settings class type.
                    App.list = new ObservableCollection<Number>();
                }
            }
        }
    }
}

Содержимое файла XML

<?xml version="1.0"?>
<ArrayOfNumber xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Number>
        <numbers>23</numbers>
    </Number>
    <Number>
        <numbers>50</numbers>
    </Number>
    <Number>
        <numbers>14</numbers>
    </Number>
    <Number>
        <numbers>76</numbers>
    </Number>
    <Number>
        <numbers>21</numbers>
    </Number>
</ArrayOfNumber>

Согласно Робтиффани , в статье, опубликованной 5 ноября, сериализация наблюдаемой коллекции таким образом должна работать. Что я делаю не так?

...