为什么XMLTextReader在传递StringReader对象时返回none?

时间:2012-06-14 06:34:38

标签: c# .net xml xml-serialization

我想将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并且我的程序突然结束,没有给出任何异常。 这种行为可能是什么原因?

1 个答案:

答案 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; }
}