我想将xml字符串反序列化为类型为class的对象,如下所示
[Serializable]
[XmlRoot("rt")]
public class XMLSessionParameters
{
[XmlArrayItem("el")]
public List<Elements> Elements { get; set; }
}
public class Elements
{
[XmlAttribute("nm")]
public string Name { get; set; }
[XmlAttribute("vl")]
public string Value { get; set; }
}
以下是XML,我想反序列化
<rt>
<el nm="Name" vl="ABCD_test"/>
<el nm="Dual" vl="AA"/>
<el nm="Quad" vl="ABCD"/>
<el nm="YYMMDD" vl="120614"/>
</rt>
以下是我用于反序列化XML字符串
的方法public static XMLSessionParameters DeserializeSessionParameters(string xmlString)
{
XMLSessionParameters parameters = (XMLSessionParameters)Deserialize(typeof(XMLSessionParameters), xmlString);
XElement root = XElement.Parse(xmlString);
List<XElement> fileElements = root.Elements().ToList();
foreach (XElement fileEle in fileElements)
{
string xml = fileEle.ToString();
Elements ele = (Elements)Deserialize(typeof(Elements), xml);
parameters.Elements.Add(ele);
}
return parameters;
}
private static object Deserialize(Type type, string XmlString)
{
XmlSerializer serializer = new XmlSerializer(type);
StringReader stringReader = new StringReader(XmlString);
XmlReader xmlReader = new XmlTextReader(stringReader);
object serializedObj = serializer.Deserialize(xmlReader);
return serializedObj;
}
当我将上面提到的XML作为字符串传递并且当调用Deserialize函数时,XMLReader对象拥有值为None并且我的程序突然结束,没有给出任何异常。 这种行为可能是什么原因?
答案 0 :(得分:4)
xml与类不匹配;你需要:
[XmlElement("el")]
public List<Elements> Elements { get; set; }
您对[XmlArrayItem]
(使用隐式[XmlArray]
)的使用适用于xml:
<rt>
<Elements>
<el nm="Name" vl="ABCD_test"/>
<el nm="Dual" vl="AA"/>
<el nm="Quad" vl="ABCD"/>
<el nm="YYMMDD" vl="120614"/>
</Elements>
</rt>
(注意额外的Elements
包装元素)。如果您使用[XmlElement]
,则会将其删除。
另外:删除[Serializable]
:XmlSerializer不需要它。
检查属性是否正确的简单方法:设置一些典型对象并序列化它们 - 比较您所需的xml。
完整示例:
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
static class Program
{
static void Main()
{
string xmlString = @"<rt>
<el nm=""Name"" vl=""ABCD_test""/>
<el nm=""Dual"" vl=""AA""/>
<el nm=""Quad"" vl=""ABCD""/>
<el nm=""YYMMDD"" vl=""120614""/>
</rt>";
XMLSessionParameters parameters = (XMLSessionParameters)Deserialize(typeof(XMLSessionParameters), xmlString);
// parameters now has 4 elements, all correctly configured
}
private static object Deserialize(Type type, string XmlString)
{
XmlSerializer serializer = new XmlSerializer(type);
StringReader stringReader = new StringReader(XmlString);
XmlReader xmlReader = new XmlTextReader(stringReader);
object serializedObj = serializer.Deserialize(xmlReader);
return serializedObj;
}
}
[XmlRoot("rt")]
public class XMLSessionParameters
{
[XmlElement("el")]
public List<Elements> Elements { get; set; }
}
public class Elements
{
[XmlAttribute("nm")]
public string Name { get; set; }
[XmlAttribute("vl")]
public string Value { get; set; }
}