2011-01-26 1 views
1

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

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

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

А вот как я десериализация данные:
 
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 или других классов он сбой. У кого-нибудь есть предложения?

ответ

2

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

+0

Я действительно надеялся, что это предложение будет работать, потому что меня не осенило, что я сделал его закрытым. Тем не менее, изменение его на внутреннее устройство по-прежнему вызывало ту же ошибку и даже изменение его на публичный набор вызывало ту же ошибку. Вот что он говорит конкретно, только для пояснения: Необработанное исключение типа «System.InvalidOperationException» произошло в System.Xml.dll Дополнительная информация: В документе XML есть ошибка (2, 2). – legacybass

+0

Я только что понял, что, пытаясь найти работу, я вчера сделал изменения после публикации этого запроса справки, который рассказывал сериализатору разную информацию, чем то, что я пытался десериализовать. После изменения свойства «index» на внутренний он работает отлично. Вы, ребята, потрясающие! – legacybass

1

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

XmlSerializer сериализатору = новый XmlSerializer (TypeOf (Список < Инцидент >));

вместо

XmlSerializer сериализатором = новый XmlSerializer (TypeOf (Падающий));

+0

Я действительно пробовал оба способа несколько раз. Я даже попробовал комбинацию из двух шагов сериализации и шагов десериализации, но безрезультатно. Вероятно, я должен был сделать это более ясным в моих примерах кода, но User.Data фактически является объектом List . Я просто изменил имя класса и объекта, чтобы сделать его более общим. – legacybass

0

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

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; 
    }