在c#中反序列化xml的最佳方法?

时间:2011-04-28 15:12:08

标签: c# linq-to-xml xmlserializer xml-deserialization

我有以下xml:

<return_obj from_call_to="categories">
  <categories>
    <category>
      <value>12341234</value>
      <label>First</label>
    </category>
    <category>
      <value>242234234</value>
      <label>Another</label>
    </category>
  </categories>
</return_obj>

标记了一个对象,将其序列化为

[XmlRoot(ElementName = "return_obj")]
public class returnobject
{
    [XmlElement]
    public category[] categories { get; set; }
}

public class category
{
    [XmlElement]
    public string value { get; set; }
    [XmlElement]
    public string label { get; set; }
}

并尝试使用它来做到这一点

    var ser = new XmlSerializer(typeof (returnobject));
    var obj = (returnobject)ser.Deserialize(File.OpenRead("test.xml"));

但是,类别集合总是有些为空。

我做错了什么?还有更好的方法吗?

由于

3 个答案:

答案 0 :(得分:2)

categories中公开class returnobject字段。那会有所帮助。

答案 1 :(得分:1)

XmlSerializer仅查看公共字段和属性,因此您必须在categories类中公开returnobject

此外,您必须指定要使用的XML数组容器的名称,在您的情况下categories - 这对我有用:

[XmlRoot(ElementName = "return_obj")]
public class returnobject
{
    [XmlArray("categories")]
    [XmlArrayItem("category")]
    public category[] categories { get; set; }
}

答案 2 :(得分:0)

仅供参考,XmlSerializer必须生成序列化类型的类型信息。这可能需要一段时间,因此您可能会发现序列化和反序列化需要几百毫秒。您可以通过运行SGEN来预先生成序列化程序集来解决这个问题。

或者,您可以使用XmlReader读取XML并自己编写序列化代码。这是更多的代码,但总是表现良好,并没有额外的组件负担(生成或不生成)。