2012-01-16 102 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