2012-01-16 123 views
1

我有一個我試圖序列化/反序列化的對象的通用列表。反序列化通用列表時的反序列化錯誤

的對象的類本身有另一個類的泛型列表的屬性,

class Exercise 
{ 
    public int Duration { get; set; }; 
    public string Name { get; set; }; 
} 

class Session 
{ 
    public DateTime Date { get; set; } 
    public List<Exercise> ExerciseList { get; set; } 
} 

這是系列化的樣子

Session session = new Session((DateTime)dpDate.Value, exercises); //exercises is a List<Exercise> 
... 
Sessions = new List<Session>(); 
Sessions.Add(session); 
XmlSerializer xml = new XmlSerializer(typeof(List<Session>)); 
xml.Serialize(stream, Sessions); 
... 

這是生成的XML看起來像

<?xml version="1.0" encoding="utf-16"?> 
<ArrayOfSession xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Session> 
    <Date>2012-01-17T00:00:00+03:00</Date> 
    <ExerciseList> 
     <Exercise> 
     <Name>q</Name> 
     <Duration>10</Duration> 
     </Exercise> 
     <Exercise> 
     <Name>w</Name> 
     <Duration>20</Duration> 
     </Exercise> 
    </ExerciseList> 
    </Session> 
</ArrayOfSession> 

然而,當試圖反序列化它像

... 
XmlSerializer xml = new XmlSerializer(typeof(List<Session>)); 
Sessions = (List<Session>)xml.Deserialize(stream); 
... 

它顯示在第二行以下錯誤:

出現InvalidOperationException有XML文檔中的一個錯誤(3,4)

那麼可能是什麼問題?

EDIT

我需要澄清這是窗口電話,所以流形成這樣

IsolatedStorageFileStream stream = storage.CreateFile(fileName); 
Sessions = new List<Session>(); 
Sessions.Add(session); 
XmlSerializer xml = new XmlSerializer(typeof(List<Session>)); 
xml.Serialize(stream, Sessions); 

然而,用於顯示我所用

的XML結構的目的
StringWriter s = new StringWriter(); 
xml.Serialize(s, Sessions); 

所以,我沒有訪問實際的xml文件來刪除encoding =「utf-16」


它不會讓我回答我的問題,由於低信譽另外5個小時,所以我將它張貼在這裏:

所以,這個問題竟然是沒有編碼,已建議。

顯然,所有正在被序列化的類都必須有一個默認參數少的構造函數。現在,我已經添加了他們所有的作品出色。 (我仍然不知道它是否是Windows Phone xml序列化或xml序列化的一般情況)

+0

你可以嘗試通過刪除'encoding =「utf-16」?「來反序列化它嗎? – 2012-01-16 10:39:26

+0

完全刪除或用其他東西代替? – 2012-01-16 10:40:28

+0

完全刪除它,還提供代碼如何生成流。 – 2012-01-16 10:43:19

回答

0

您缺少<ArrayOfSession>元素的結束標記。

<?xml version="1.0" encoding="utf-16"?> 
<ArrayOfSession xmlns:xsi= ..."> 
    <Session> 
    ... 
    </Session> 
</ArrayOfSession> 
+0

是這樣嗎?你知道爲什麼在序列化時它是這樣形成的嗎?其實,我很確定它應該是>(它最終以結尾> – 2012-01-16 10:32:40

+0

我已經更新了我的答案 – 2012-01-16 10:34:14

+0

是的,對不起,我錯過了最後一行,它實際上就是這樣。 – 2012-01-16 10:34:59

1

試試這個

//Serialize 
public static string SerializeObject<T>(object o) 
{ 
     MemoryStream ms = new MemoryStream(); 
     XmlSerializer xs = new XmlSerializer(typeof(T)); 
     XmlTextWriter xtw = new XmlTextWriter(ms, Encoding.UTF32); 
     xs.Serialize(xtw, o); 
     ms = (MemoryStream)xtw.BaseStream; 
     UTF32Encoding encoding = new UTF32Encoding(); 
     return encoding.GetString(ms.ToArray()); 
} 

//Deserialize 
public static T DeserializeObject<T>(string xml) 
{ 
     XmlSerializer xs = new XmlSerializer(typeof(T)); 
     UTF32Encoding encoding = new UTF32Encoding(); 
     Byte[] byteArray = encoding.GetBytes(xml); 
     MemoryStream ms = new MemoryStream(byteArray); 
     XmlTextWriter xtw = new XmlTextWriter(ms, Encoding.UTF32); 
     return (T)xs.Deserialize(ms); 
} 

希望這能解決你的問題。

如果可能請通過this發帖。

+0

如果它能工作,稍後再做並回復你 – 2012-01-16 11:05:08

+0

好的,問題簡單得多 - 所有被序列化的類都必須有一個無參數的構造函數。幫助,雖然 – 2012-01-16 12:23:21

+0

嗯在哪個類你添加了默認的構造函數,因爲如果你沒有提到任何構造函數,默認情況下有一個parameterle ss構造函數可用。默認情況下,它也是XML序列化程序需要的,因爲除非運行時直接運行時才能實例化對象,否則不能用其他屬性填充它。 – 2012-01-16 12:53:56