2011-01-26 80 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; } 
    } 

當我給串行器只是簡單的類它的作品,所以我知道自己工作的串行器,但是當我創建的對象的列表從我的數據類或其他類,它崩潰。任何人有任何建議?

回答

2

由於「索引」是數據的公共屬性,因此解串器試圖設置它的值。這因爲設置爲「索引」是私人的而失敗。嘗試設置「索引」內部而不是公共,它應該反序列化正確。

+0

我真的希望這個建議能起作用,因爲我沒有想到我已經將它設置爲私人。但是,將其更改爲內部仍然會導致相同的錯誤,甚至將其更改爲公共設置會導致相同的錯誤。以下是特別說明的內容,僅供參考: System.Xml.dll中發生未處理的System.InvalidOperationException異常的異常 其他信息:XML文檔(2,2)中存在錯誤。 – legacybass 2011-01-26 17:40:30

1

嘗試傳入列表類型而不是列表中的類型。例如:

XmlSerializer的串行=新的XmlSerializer(typeof運算(列表<事件>));的

代替

XmlSerializer的串行=新的XmlSerializer(typeof運算(事件));

+0

其實我已經嘗試了兩種方式幾次。我甚至在序列化步驟和反序列化步驟中嘗試了兩者的結合,但無濟於事。我可能應該已經在我的代碼示例中更清楚了,但User.Data實際上是一個List 對象。我只是改變了類和對象的名稱,使其更通用。 – legacybass 2011-01-26 17:37:52

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