3

我想将xml字符串反序列化为定义如下的类型类的对象

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

4

1 回答 1

6

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; }
}
于 2012-06-14T06:38:40.303 回答