如何使用XmlSerializer类反序列化这个简单的xml配置?

时间:2008-11-06 23:39:10

标签: xml xml-serialization xsd.exe

我有以下xml我想反序列化为类

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <element1>String1</element1>
  <element2>String2</element2>
</root>

我正在尝试将其序列化为以下类:

    [XmlRoot("root")]
    public class root
    {
        [XmlElement("element1")]
        internal string element1 { get; set; }

        [XmlElement("element2")]
        internal string element2 { get; set; }
    }

当我尝试使用以下代码反序列化时,实例化配置对象,但字符串为空。

     using (TextReader reader = new StreamReader(configFile))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(root));
            this.config = (root)serializer.Deserialize(reader);
        }

我尝试使用xsd.exe创建一个xsd,然后根据它创建一个类,但该工具生成的杂乱太多了。我想我离这儿很近。我错过了什么?

4 个答案:

答案 0 :(得分:7)

您无法序列化/反序列化内部属性 - 它们必须是公开的。

答案 1 :(得分:5)

我同意布罗迪关于你问题的本质。但是,您可能反对将这些字段公开。我过去处理这个问题的方法是创建一个可序列化的类,其唯一目的是读/写.xml并将其所有字段公开。然后创建一个新的类,它是外部接口。它将可序列化类作为构造函数的参数,外部类提供控制对可序列化类的访问的公共属性。

答案 2 :(得分:1)

要跟进我的实现......我最终放弃了使用XmlSerializer类。我反序列化的类非常复杂,包含需要序列化的其他对象的列表。我必须添加到我的类中的属性数量为code stink

我最终使用Linq to XML进行反序列化....类级别的复杂性降低了,但是linq语句变得相当复杂。

如果我再次这样做,我可能会考虑使用WCF和datacontract序列化器...这也可能也很难做到。

我很好奇人们如何将xml文档反序列化为对象。在了解了Linq的陈述之后,我认为这可能是要走的路。这些对象更容易创建,并且不需要公开。看起来XmlSerializer似乎是“老派”,而Linq to XML更像是“新学校”。

我很想听别人说的话。

答案 3 :(得分:1)

您可以使用XSD.exe从XSD(XML架构定义)生成类。这产生了一个可用的类结构,可以序列化和反序列化相关的XML。