反序列化通用列表时的反序列化错误
我有一个我试图序列化/反序列化的对象的通用列表。反序列化通用列表时的反序列化错误
的对象的类本身有另一个类的泛型列表的属性,
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序列化的一般情况)
您缺少<ArrayOfSession>
元素的结束标记。
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfSession xmlns:xsi= ...">
<Session>
...
</Session>
</ArrayOfSession>
是这样吗?你知道为什么在序列化时它是这样形成的吗?其实,我很确定它应该是>(它最终以 ArrayOfSession>结尾> – 2012-01-16 10:32:40
我已经更新了我的答案 – 2012-01-16 10:34:14
是的,对不起,我错过了最后一行,它实际上就是这样。 – 2012-01-16 10:34:59
试试这个
//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发帖。
如果它能工作,稍后再做并回复你 – 2012-01-16 11:05:08
好的,问题简单得多 - 所有被序列化的类都必须有一个无参数的构造函数。帮助,虽然 – 2012-01-16 12:23:21
嗯在哪个类你添加了默认的构造函数,因为如果你没有提到任何构造函数,默认情况下有一个parameterle ss构造函数可用。默认情况下,它也是XML序列化程序需要的,因为除非运行时直接运行时才能实例化对象,否则不能用其他属性填充它。 – 2012-01-16 12:53:56
你可以尝试通过删除'encoding =“utf-16”?“来反序列化它吗? – 2012-01-16 10:39:26
完全删除或用其他东西代替? – 2012-01-16 10:40:28
完全删除它,还提供代码如何生成流。 – 2012-01-16 10:43:19