【问题标题】:deserialize simple xml into List<string>将简单的 xml 反序列化为 List<string>
【发布时间】:2014-03-18 11:02:36
【问题描述】:

我知道这是一个非常愚蠢的问题,但我被困住了......(类似的问题没有有用的答案here

我的xml是

<Param>
    <MyList>
        <mynode>aaa</mynode>
        <mynode>bbb</mynode>
        <mynode>ccc</mynode>
        <mynode>ddd</mynode>
    </MyList>
</Param>

我有这样的课程

public class MyClass
{
    [XmlArray("MyList")]
    [XmlArrayItem("mynode")]
    public List<string> MyList { get; set; }
}

但是当我尝试反序列化时,我得到一个 nullerrorexception

为什么这不起作用?

编辑: 反序列化代码:

public static Param InitConfig(string Path)
{
    XmlRootAttribute xRoot = new XmlRootAttribute();
    xRoot.ElementName = "Param";
    xRoot.IsNullable = true;

    XmlSerializer serializer = new XmlSerializer(typeof(Param), xRoot);
    using (StreamReader reader = new StreamReader(Path))
    {
        return (Param)serializer.Deserialize(reader);
    }
}

public class Param
{
    public MyClass MyClass {get; set;}
}

(实际上更复杂)

【问题讨论】:

  • 那么什么不起作用?错误是什么?出了什么问题?
  • 尝试用示例数据填充类并对其进行序列化 - 然后您将看到反序列化期望作为输入的内容。
  • 无法触摸 xml 文件...我必须弄清楚如何在 List 中反序列化该结构

标签: c# xml xml-deserialization


【解决方案1】:

如果没有看到实际执行序列化的代码,就很难找到错误。但是,您可以尝试告诉序列化程序 xml 的顶部元素是什么:

[XmlRoot("Param")]
public class MyClass
{
    [XmlArray("MyList")]
    [XmlArrayItem("mynode")]
    public List<string> MyList { get; set; }
}

编辑: 序列化器的类型应该是MyClass:

public static Param InitConfig(string Path)
{
    XmlRootAttribute xRoot = new XmlRootAttribute();
    xRoot.ElementName = "Param";
    xRoot.IsNullable = true;

    XmlSerializer serializer = new XmlSerializer(typeof(MyClass), xRoot);
    using (StreamReader reader = new StreamReader(Path))
    {
        return new Param {MyClass = (MyClass)serializer.Deserialize(reader)};
    }
}

【讨论】:

  • 这不会编译。XmlElement 属性不能应用于class
【解决方案2】:

你需要像这样使用XmlRoot 属性和MyClass

[XmlRoot("Param")]
public class MyClass
{
    [XmlArray("MyList")]
    [XmlArrayItem("mynode")]
    public List<string> MyList { get; set; }
}

然后你可以使用这个代码Deserialize你的xml:

XmlSerializer se = new XmlSerializer(typeof(MyClass));
using(var stream = File.OpenRead("filePath"))
{
   var myClass = (MyClass) se.Deserialize(stream);
}

【讨论】:

    【解决方案3】:

    这是一种解决方案

            XmlSerializer rializer = new XmlSerializer(typeof(MyClass));
    
            using (var stream = File.OpenRead("C:\\Users\\t0408\\Desktop\\testfor.xml"))
            {
                MyClass myClass = (MyClass)rializer.Deserialize(stream);
            }
    

    // 类应该是这样的

            [XmlRoot("Param")]
             public class MyClass
             {
               [XmlArrayItem("mynode")]
               public List<string> MyList { get; set; }
             }
    

    谢谢 连线

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      相关资源
      最近更新 更多