2013-01-04 112 views
2

這是反序列化的代碼:反序列化XML返回空

XmlRootAttribute xRoot = new System.Xml.Serialization.XmlRootAttribute(); 
xRoot.ElementName = "myList"; 
xRoot.IsNullable = true; 
xRoot.Namespace = "http://schemas.datacontract.org/2006/05/Blah.Blah.Blah"; 
XmlSerializer serializer = new XmlSerializer(typeof(myList), xRoot); 
XmlReader reader = new System.Xml.XmlTextReader(url); 
myList myDeserializedList = (myList)serializer.Deserialize(reader); 
reader.Close(); 

而且myDeserializedList是空的,但是當我去到URL我看到一個相當大的XML。

這裏是我的課:

[Serializable()] 
public class myItem 
{ 
    [System.Xml.Serialization.XmlElement("Key")] 
    public long Key { get; set; } 
    [System.Xml.Serialization.XmlElement("Discount")] 
    public double Discount { get; set; } 
} 


[Serializable, System.Xml.Serialization.XmlRoot("myList")] 
public class myList 
{ 
    [System.Xml.Serialization.XmlArray("myList")] 
    [System.Xml.Serialization.XmlArrayItem("myItem", typeof(myItem))] 
    public List<myItem> myItem { get; set; } 
} 

這裏是XML:

<myList xmlns="http://schemas.datacontract.org/2006/05/Blah.Blah.Blah" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <myItem> 
     <Key>3465</Key> 
     <Discount>0.00000000</Discount> 
    </myItem> 
</myList> 
+1

沒有考慮'linq2xml'的任何具體原因 – Anirudha

+1

如果有疑問,請在內存中創建一個帶有myItem的樣本myList,並將其序列化爲XML,然後將其與您嘗試讀取的源進行比較。通常這樣你就可以看到有什麼不同,需要改變什麼才能使之發揮作用。編輯:例如,我敢打賭,你有資格佩戴的方式,可能會出來爲' ... '(雖然我總是要仔細檢查) –

+0

你有控制權數據源(可以更改XML模式)還是已修復? –

回答

4

您的代碼試圖讀/寫XML,看起來像這樣:

<myList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.datacontract.org/2006/05/Blah.Blah.Blah"> 
    <myList> 
    <myItem> 
     <Key>3465</Key> 
     <Discount>0.00000000</Discount> 
    </myItem> 
    </myList> 
</myList> 

注意第二個myList標籤包裝收集。

所有你需要做的是溝XmlArrayXmlArrayItem屬性,而不是使用XmlElement。這將指示XmlSerializer將項目集合內聯放置,而不是嵌套在另一個元素內。

[Serializable, System.Xml.Serialization.XmlRoot("myList")] 
public class myList 
{ 
    [XmlElement] 
    public List<myItem> myItem { get; set; } 
} 

編輯:另外,你不需要使用大多數的屬性; XmlSerializer的做應用,它顯得有些多餘重新聲明它們的默認值的好工作,所以你可能只是有:

public class myItem 
{ 
    public long Key { get; set; } 
    public double Discount { get; set; } 
} 

public class myList 
{ 
    [XmlElement] 
    public List<myItem> myItem { get; set; } 
} 

即使溝xRoot.ElementName = "myList";線,它仍然會產生完全相同的XML。儘管如果你想明確說明你的期望,或者你期望你可以在不改變XML的情況下更改你的屬性/類標識符,那麼請隨時保留它。