0

我有以下 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

4 回答 4

7

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

于 2008-11-06T23:46:31.747 回答
5

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

于 2008-11-06T23:51:26.837 回答
1

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

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

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

我很好奇这些天人们是如何将 xml 文档反序列化为对象的。在了解了 Linq 语句之后,我认为这可能是要走的路。对象的创建要简单得多,而且它们不需要公开。看起来 XmlSerializer 是“老派”,而 Linq to XML 更像是“新派”。

我很想听听别人怎么说。

于 2008-11-10T19:50:31.393 回答
1

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

于 2008-11-13T01:22:40.053 回答