XML反序列化问题在C#
问题描述:
我需要反序列化下列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方法。之后,一切正常!
谢谢大家的回答!
答
我已经验证了您的示例代码和您得到类型System.OutOfMemoryException包含一个InnerException。
DBChange类的ReadXml方法在无限循环中调用。
更改此方法如下:
public void ReadXml(System.Xml.XmlReader reader) {
mValue = reader.GetAttribute("value");
reader.Read();
}
reader.Read的()的调用会告诉XmlSerializer的完成当前元素的阅读和去在XML序列中的下一个元素。
答
如果你不坚持使用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)
{
// ...
}
答
确保您有这在文件中:
<?xml version="1.0" encoding="ISO-8859-1"?>
<NodeConfiguration>
<DBChange value="2022"/>
<DBChange value="555" />
<DBChange value="12:00" />
</NodeConfiguration>
更改:
[XmlType("NodeConfiguration")]
要:
[XmlRoot("NodeConfiguration")]
尝试在内存中创建对象并对其进行序列化。然后你可以看到xml应该是什么样子的结构。 – 2012-01-27 17:26:10
你有没有在文件中的XML标头? – craig1231 2012-01-27 17:29:48