反序列化泛型列表时出现反序列化错误

本文关键字:反序列化 错误 泛型 列表 | 更新日期: 2023-09-27 18:20:20

我有一个要序列化/取消序列化的对象的通用列表。

对象的类本身具有另一个类的泛型列表的属性

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)中存在错误

那么问题出在哪里呢?

编辑

我需要澄清的是,它是为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个小时,所以我会把它发布在这里:

因此,问题不在于编码,正如人们所建议的那样。

显然,所有正在序列化的类都必须有一个默认的无参数构造函数。现在我添加了它们,一切都很顺利。(我仍然不知道这是windows phone xml序列化还是一般的xml序列化)

反序列化泛型列表时出现反序列化错误

试试这个

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

希望这能解决你的问题。

如果可能的话,请浏览此帖子。

您缺少<ArrayOfSession>元素的结束标记。

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