我有以下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,然后根据它创建一个类,但该工具生成的杂乱太多了。我想我离这儿很近。我错过了什么?
答案 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。