2012-01-27 64 views
1

我需要反序列化下列XML到C#類:XML反序列化問題在C#

<NodeConfiguration> 
    <DBChange value="2022"/> 
    <DBChange value="555" /> 
    <DBChange value="12:00" /> 
</NodeConfiguration> 

要做到這一點,我構建了以下類:

[XmlType("NodeConfiguration")] 
public class NodeConfigurationSerialize 
{ 
    public NodeConfigurationSerialize() 
    { 

    } 

    [XmlElement("DBChange")] 
    public DBChange[] ChangeList { get; set; } 
} 

和:

public class DBChange : StringSerializable<DBChange>, IEquatable<DBChange>, IXmlSerializable 
{ 
    private string mValue; 


    public string Value 
    { 
     get { return mValue; } 
     set { mValue = value; } 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     mValue = reader.GetAttribute("value"); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteAttributeString("value", mValue); 
    } 

} 

問題是,無論什麼時候我試圖使用下面的方法反序列化這個類:

Deserialize<NodeConfigurationSerialize>(xml, null); 

我得到一個無效的XML錯誤。

我該如何編寫我的DBChange和NodeConfigurationSerialize類,以便我可以從上面的XML中成功反序列化它們?

PS:我使用Visual Studio 2010和.NET Framework 4.0

編輯1:

我已經改變了我NodeConfigurationSerialize類:

[XmlType("NodeConfiguration")] 
public class NodeConfigurationSerialize 
{ 
    public NodeConfigurationSerialize() 
    { 
     ChangeList = new List<DBChange>(); 
    } 

    [XmlElement("DBChange")] 
    public List<DBChange> ChangeList { get; set; } 
} 

而且我已經也做@woni建議並添加reader.Read();到我的DBChange類的ReadXml方法。之後,一切正常!

謝謝大家的回答!

+0

嘗試在內存中創建對象並對其進行序列化。然後你可以看到xml應該是什麼樣子的結構。 – 2012-01-27 17:26:10

+0

你有沒有在文件中的XML標頭? – craig1231 2012-01-27 17:29:48

回答

2

我已經驗證了您的示例代碼和您得到類型System.OutOfMemoryException包含一個InnerException。

DBChange類的ReadXml方法在無限循環中調用。

更改此方法如下:

public void ReadXml(System.Xml.XmlReader reader) { 
    mValue = reader.GetAttribute("value"); 
    reader.Read(); 
} 

reader.Read的()的調用會告訴XmlSerializer的完成當前元素的閱讀和去在XML序列中的下一個元素。

0

如果你不堅持使用XMLSERIALIZE和NodeConfiguration是您的根節點using these extensions,你可以把它寫像這樣:

public class NodeConfiguration 
{ 
    XElement self; 
    public NodeConfiguration(XElement self) { this.self = self; } 

    public IEnumerable<string> DBChanges 
    { 
     get 
     { 
      return self.GetEnumerable("DBChange", x => x.Get("value", string.Empty)); 
     } 
    } 
} 

你會用它喜歡:

XElement root = XElement.Load("filepath"); 
NodeConfiguration config = new NodeConfiguration(root); 

foreach(string dbchange in config.DBChanges) 
{ 
    // ... 
} 
0

確保您有這在文件中:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<NodeConfiguration> 
    <DBChange value="2022"/> 
    <DBChange value="555" /> 
    <DBChange value="12:00" /> 
</NodeConfiguration> 

更改:

[XmlType("NodeConfiguration")] 

要:

[XmlRoot("NodeConfiguration")]