2013-12-13 56 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到列表使用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來反序列化也是用XmlSerializer *生成的XML。 (或者至少,這是更有可能的工作......) –

+0

好吧,從XmlElement屬性中刪除了類型規範,現在錯誤消失了。在sql數據庫中生成XML – Sergio

+0

我做了一個快速測試,序列化你的類的一個實例; typeof(int)會產生反射錯誤。它適用於typeof(字符串)。 –

回答

3

的根元素不匹配。有辦法將其傳遞的XmlSerializer的構造,但IMO你最好的選擇是創建一個包裝類:

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

而且通過這個類型XmlSerializer的。

+0

嗯,這個解決方案正在工作,但有沒有辦法讓列表W/O包裝? – Sergio

+0

試試這個:'var serializer = new XmlSerializer(typeof(List ),new XmlRootAttribute(「root」));' – Ric

+0

@Ric個人我總是主張包裝器對象方法。如果其他策略也起作用,那麼很好。 –