2013-12-13 4 views
0

У меня есть объект некоторого типа, скажем Foo, глядя, как:Как десериализации XML в списке <T>

public class Foo 
{ 
    [XmlElement("id")] 
    public string Id {get; set;} 

    [XmlElement("name")] 
    public string Name {get; set;} 
} 

Также я XML:

<root> 
    <foo> 
     <id>1</id> 
     <name>name_1</name> 
    </foo> 
    <foo> 
     <id>2</id> 
     <name>name_2</name> 
    </foo> 
</root> 

Что я делаю неправильно, пытаясь десериализовать этот xml в List с помощью XmlDeserializer со следующим кодом?

var list = new List<Foo>(); 
var serializer = new XmlSerializer(typeof(List<Foo>)); 
using (var reader = new StringReader(xml)) 
{ 
    list = (List<Foo>)serializer.Deserialize(reader); //error here 
} 

Получение исключение:

System.InvalidOperationException 

<root xmlns=''> unexprected . 
+3

«некоторая ошибка отражения» - не могли бы вы уточнить? В общем, вы должны использовать XmlSerializer для десериализации XML, который также был * сгенерирован * с XmlSerializer. (Или, по крайней мере, это значительно более вероятно, чтобы работать ...) –

+0

ну, удаленная спецификация типа из атрибута XmlElement и ошибка исчезла. XML создается в базе данных sql – Sergio

+0

Я быстро проверил сериализацию экземпляра вашего класса; тип (int) вызывает ошибку отражения. Он работает с typeof (string). –

ответ

3

Корневой элемент не совпадает. Есть способы, чтобы передать его в конструктор XmlSerializer, но IMO ваш лучший выбор, чтобы создать класс-оболочку:

[XmlRoot("root")] 
public class FooWrapper { 
    [XmlElement("foo")] 
    public List<Foo> Items {get;set;} 
} 

И пройти этот тип XmlSerializer.

+0

Ну, это решение работает, но есть ли способ получить список без оболочки? – Sergio

+0

попробуйте это: 'var serializer = new XmlSerializer (typeof (List ), новый XmlRootAttribute (« root »));' – Ric

+0

@Ric лично я всегда сторонник подхода к обертке. Если другая стратегия тоже работает, отлично. –

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