Ошибка десериализации при десериализации общего списка - PullRequest
1 голос
/ 16 января 2012

У меня есть общий список объектов, которые я пытаюсь сериализовать / десериализовать.

У самого класса объектов есть свойство общего списка другого класса,

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 Phone, поэтому поток формируется следующим образом

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

Однако, чтобы показать структуру XML, яused

StringWriter s = new StringWriter();
xml.Serialize(s, Sessions);

Итак, у меня нет доступа к фактическому XML-файлу для удаления encoding = "utf-16"


Это не позволит мне ответить на мой собственный вопросиз-за низкой репутации еще 5 часов, поэтому я выложу это здесь:

Итак, проблема обернуласьно не должно быть в кодировке, как было предложено.

По-видимому, все сериализуемые классы должны иметь параметр по умолчанию без конструктора.Теперь, когда я добавил их, все работает великолепно.(Я до сих пор не знаю, что это за вещь с сериализацией Windows Phone или сериализацией XML в целом)

Ответы [ 2 ]

1 голос
/ 16 января 2012

Попробуйте это

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

Надеюсь, это решит вашу проблему.

Если возможно, пройдите эту запись.

0 голосов
/ 16 января 2012

Вам не хватает закрывающего тега для элемента <ArrayOfSession>.

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