2012-01-16 5 views
1

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

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

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:

мне нужно уточнить, что для 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 я использовал

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

Таким образом, у меня нет доступа к реальному файлу XML для удаления кодирования = "UTF-16"


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

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

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

+0

Можете ли вы попытаться десериализировать его, удалив 'encoding =" utf-16 "?' –

+0

Полностью удалив или заменив что-нибудь еще? –

+0

полностью удалите его, также укажите код, как вы генерируете поток. –

ответ

0

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

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

Это так? Знаете ли вы, почему он был создан таким образом при сериализации? На самом деле, я уверен, что он должен быть> (он закрывается в самом конце с помощью

+0

Я обновил свой ответ –

+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 сообщение.

+0

Пойдем позже и вернемся к вам, если он сработает –

+0

Хорошо, проблема была намного проще - все классы, которые были сериализованы, должны иметь конструктор без параметров. помогите, однако. –

+0

Хмм, в каком классе вы добавили конструктор по умолчанию, потому что, если вы не упоминаете какой-либо конструктор, по умолчанию есть параметр Имеется конструктор ss. Также это требуется по XML-сериализатору по умолчанию, потому что, если и до истечения времени запуска не может создать экземпляр объекта, он не сможет заполнить его другим свойством. –

Смежные вопросы