我有一个通用的对象列表,我正在尝试序列化/解除序列化。
对象的类本身具有另一个类的通用列表的属性
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 document(3,4)
中有错误那么可能是什么问题?
修改:
我需要澄清它适用于Windows手机,因此流形成如下
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个小时的声望很低,我不会回答我自己的问题,所以我会在这里发布:
所以,问题结果证明不是编码,正如所建议的那样。
显然,所有被序列化的类必须具有默认参数less constructor present。现在我已经添加了它们,一切都很棒。 (我仍然不知道它是否与windows phone xml序列化或xml序列化一般)
答案 0 :(得分: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发布。
答案 1 :(得分:0)
您缺少<ArrayOfSession>
元素的结束标记。
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfSession xmlns:xsi= ...">
<Session>
...
</Session>
</ArrayOfSession>