Как я могу десериализовать объект из строки XML?

Я пытаюсь десериализовать объект обратно из его строки XML, используя xmlSerializer.Deserialize(), но возвращаемый объект всегда пуст (не нуль, но все свойства равны нулю или 0). Я не могу понять, что я делаю неправильно, и все же я не получаю ошибок или исключений.

string xml = "***my xml is here***";

XmlSerializer ser = new XmlSerializer(typeof(Order));
StringReader stringReader = new StringReader(xml);
XmlTextReader xmlReader = new XmlTextReader(stringReader);
Order order = (Order)ser.Deserialize(xmlReader);
xmlReader.Close();
stringReader.Close();

Источник Order.cs был сгенерирован из XSD с помощью инструмента xsd.exe.

Источник order.cs: http://www.nickgilbert.com/etc/1/Order.txt

Пример XML заказа: http://www.nickgilbert.com/etc/1/example-order.xml


person NickG    schedule 10.10.2011    source источник
comment
Я собирался вставить XML и исходный код Order.cs, но не вижу, как сюда прикреплять файлы.   -  person NickG    schedule 10.10.2011
comment
Можете ли вы опубликовать свой класс Order?   -  person Graymatter    schedule 10.10.2011
comment
Просто поместите код в свой вопрос. Но вы не должны включать весь исходный код, только минимальный код, который имеет ту же проблему.   -  person svick    schedule 10.10.2011
comment
Не прикрепляйте файлы, скопируйте/вставьте соответствующие части в вопрос.   -  person Henk Holterman    schedule 10.10.2011
comment
Мне кажется правильным. Как выглядит XML? Есть ли у свойств геттеры/сеттеры? Как вы сериализуете Order? Вы размещаете теги Serializable в своих свойствах?   -  person Jesse Seger    schedule 10.10.2011
comment
Вам не нужен XmlReader. Вероятно, не ошибка, но чтобы быть уверенным: ser.Deserialize(stringReader)   -  person Henk Holterman    schedule 10.10.2011
comment
Кроме того, откажитесь от xmlserializer и используйте DataContractSerializer. В целом лучший сериализатор.   -  person    schedule 10.10.2011
comment
@Будет ли это зависеть; DCS не хватает мелкозернистого управления xml (элементы и т. д.). DataContractSerializer имеет лучшие функции (обратные вызовы и т. д.), но XmlSerializer лучше контролирует xml.   -  person Marc Gravell    schedule 10.10.2011
comment
@MarcGravell: Это может быть плохо. Хорошо, если вы не контролируете xml, плохо, если вы это делаете; многие новички, беспокоящиеся о том, красив ли их xml, задавали здесь вопросы о XmlSerializer... Э-э, я полагаю, что потратил немало времени, когда впервые использовал его, делая то же самое. Эрг.   -  person    schedule 10.10.2011
comment
@Буду ли я больше беспокоиться о соответствии спецификации, чем о красоте; p И атрибуты не совсем редкость.   -  person Marc Gravell    schedule 10.10.2011
comment
Теперь я опубликовал источник Order.cs и XML.   -  person NickG    schedule 10.10.2011
comment
@Nick: Нет, ты разместил 2 ссылки. Пожалуйста, прочитайте комментарии.   -  person Henk Holterman    schedule 10.10.2011
comment
@Henk Извините, если ваш браузер не поддерживает ссылки.   -  person NickG    schedule 10.10.2011
comment
@Ник: очень смешно. Ответы здесь не только для того, чтобы помочь вам, но и для формирования репозитория. Как долго эти файлы будут доступны?   -  person Henk Holterman    schedule 10.10.2011


Ответы (2)


В вашем образце XML-файла (example-order.xml) используется пространство имен http://tempuri.org/OrderSchema.xsd, но код, сгенерированный XSD (order.cs), определяет все элементы в пространстве имен http://x-rm.com/wrightcottrell/cataloguecd/.

Вам нужно, чтобы эти пространства имен совпадали, чтобы сериализация работала правильно.

person pmartin    schedule 10.10.2011

Тот факт, что вы возвращаете объект вообще, говорит мне, что объект является общедоступным и имеет общедоступный конструктор без параметров (иначе было бы выдано исключение). Таким образом, это, скорее всего, не работает одно из:

  • члены десериализации должны быть либо общедоступными свойствами с общедоступными get и общедоступными set, либо общедоступными (не только для чтения) полями.
  • по умолчанию имена членов должны точно совпадать с именами xml element в том же пространстве имен xml, что и родительский элемент; более тонкое управление можно получить с помощью атрибутов (изменение имени, использование атрибутов, пространств имен и т. д.)
person Marc Gravell    schedule 10.10.2011
comment
У меня нет конструктора для Order — я предполагаю, что значения заполняются функцией Deserialize, а не конструктором? - person NickG; 10.10.2011
comment
@Ник, да, ты знаешь; если вы его не объявите, компилятор предполагает открытый конструктор без параметров. Без общедоступного конструктора без параметров он не работал бы. - person Marc Gravell; 10.10.2011