2012-01-27 71 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")]