Как я могу десериализовать объект из строки XML? - PullRequest
0 голосов
/ 10 октября 2011

Я пытаюсь десериализовать объект обратно из его строки XML, используя xmlSerializer.Deserialize (), но возвращаемый объект всегда пуст (не ноль, но все свойства имеют значение null или 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

Ответы [ 2 ]

2 голосов
/ 10 октября 2011

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

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

1 голос
/ 10 октября 2011

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

  • члены десериализации должны быть либо общедоступными свойствами с общедоступными get и общедоступными set, либо общими (не только для чтения) полями
  • по умолчанию имена членов должны точно соответствовать именам элементов xml в том же пространстве имен xml, что и родительский элемент; Более точное управление может быть получено через атрибуты (изменение имени, использование атрибутов, пространства имен и т. д.)
...