Windows Phone 7 изолированные ошибки сериализации хранилища со списком объектов - PullRequest
1 голос
/ 26 января 2011

Я пытался сериализовать список объектов из класса и продолжаю получать сообщение об ошибке, указывающее на наличие ошибки в файле XML в точке (25, 6) (эти числа меняются в зависимости от того, что я пытаюсь сериализовать) .

Вот пример того, как я пытаюсь сериализовать данные:

using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
{
    using((IsolatedStorageFileStream fs = isf.CreateFile("data.dat"))
    {
        XmlSerializer ser = new XmlSerializer(User.Data.GetType());
        ser.Serialize(fs, User.Data);<br />
    }
}

И вот как я десериализирую данные:
using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
{
    if (isf.FileExists("Data.dat"))
    {
        using (IsolatedStorageFileStream fs = isf.OpenFile("Data.dat", System.IO.FileMode.Open))
        {
            XmlSerializer ser = new XmlSerializer(User.Data.GetType());
            object obj = ser.Deserialize(fs);
            if (null != obj && obj is Data)
                User.Data= obj as Data;
        }
    }
}

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

Вот пример класса, который я использую:

public class Data
    {
        public static int counter;

        public Data() { this.index = counter++; }

        public DateTime availablefrom { get; set; }
        public DateTime availableuntil { get; set; }
        public string course { get; set; }
        public DateTime? datetaken { get; set; }
        public double duration { get; set; }
        public string instructions { get; set; }
        public string instructorname { get; set; }
        public double scorepointscorrect { get; set; }
        public double scorepointspossible { get; set; }
        public string testname { get; set; }
        public int index { get; private set; }
    }

Когда я даю сериализатору только простые классы, он работает, поэтому я знаю, что сам сериализатор работает, но когда я создаю список объектов из своего класса Data или других классов, он падает. У кого-нибудь есть предложения?

Ответы [ 3 ]

2 голосов
/ 26 января 2011

Поскольку «index» является публичным свойством данных, десериализатор пытается установить его значение. Это терпит неудачу, потому что набор для "индекса" является частным. Попробуйте установить «index» для внутренних вместо public, и он должен десериализоваться правильно.

1 голос
/ 26 января 2011

Попробуйте передать тип списка вместо того, который указан в списке. Например:

XmlSerializer serializer = новый XmlSerializer (typeof ( Список ));

вместо

XmlSerializer serializer = новый XmlSerializer (typeof ( Инцидент ));

0 голосов
/ 26 января 2011

Вот как я могу сохранять и загружать списки объектов в изолированное хранилище и из него:

    private static IsolatedStorageFile _isoStore;
    public static IsolatedStorageFile IsoStore 
    { 
        get { return _isoStore ?? (_isoStore = IsolatedStorageFile.GetUserStoreForApplication()); }
    }

    public static void SaveList<T>(string folderName, string dataName, ObservableCollection<T> dataList) where T : class
    {
        if (!IsoStore.DirectoryExists(folderName))
        {
            IsoStore.CreateDirectory(folderName);
        }

        string fileStreamName = string.Format("{0}\\{1}.dat", folderName, dataName);

        using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileStreamName, FileMode.Create, IsoStore))
        {
            DataContractSerializer dcs = new DataContractSerializer(typeof(ObservableCollection<T>));
            dcs.WriteObject(stream, dataList);
        }
    }

    public static ObservableCollection<T> LoadList<T>(string folderName, string dataName) where T : class
    {
        ObservableCollection<T> retval = new ObservableCollection<T>();

        string fileStreamName = string.Format("{0}\\{1}.dat", folderName, dataName);

        using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileStreamName, FileMode.OpenOrCreate, IsoStore))
        {
            if (stream.Length > 0)
            {
                DataContractSerializer dcs = new DataContractSerializer(typeof(ObservableCollection<T>));
                retval = dcs.ReadObject(stream) as ObservableCollection<T>;
            }
        }

        return retval;
    }
...