Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有理由不使用XmlSerializer?_C#_.net_Xml_Serialization - Fatal编程技术网

C# 有没有理由不使用XmlSerializer?

C# 有没有理由不使用XmlSerializer?,c#,.net,xml,serialization,C#,.net,Xml,Serialization,我刚刚了解了.Net中的XmlSerializer类。以前,我总是使用标准类解析和编写XML。在我深入探讨这个问题之前,我想知道是否有任何情况下它不是正确的选择 编辑:我所说的标准类是指XmlDocument、XmlElement、XmlAttribute等。我发现XmlSerializer的主要缺点是: 1) 对于涉及集合的复杂对象图,有时很难通过使用序列化控件属性获得所需的XML模式 2) 如果你在一个版本的应用程序和下一个版本的应用程序之间更改类定义,你的文件将变得不可读。很显然,它不会给

我刚刚了解了.Net中的XmlSerializer类。以前,我总是使用标准类解析和编写XML。在我深入探讨这个问题之前,我想知道是否有任何情况下它不是正确的选择


编辑:我所说的标准类是指XmlDocument、XmlElement、XmlAttribute等。我发现XmlSerializer的主要缺点是:

1) 对于涉及集合的复杂对象图,有时很难通过使用序列化控件属性获得所需的XML模式


2) 如果你在一个版本的应用程序和下一个版本的应用程序之间更改类定义,你的文件将变得不可读。

很显然,它不会给你对输出的控制。就我个人而言,我发现LINQtoXML使手工编写这篇文章变得足够容易,我很乐意这样做,至少对于相当小的项目是如此。如果您使用的是.NET3.5或4,但没有使用LINQtoXML,请立即查看它——它比旧的DOM好得多

有时候能够控制序列化和反序列化是件好事。。。尤其是当您更改数据布局时。如果您没有遇到这种情况,也不希望遇到这种情况,那么内置的XML序列化可能会很好


编辑:我认为XML序列化不支持构造真正不可变的类型,而这显然可以从手工构建的构造中实现。因为我是不变性的粉丝,这绝对是我要关心的事情。如果您实现了
IXmlSerializable
,我相信您可以处理公共不变性,但您仍然必须是私有可变的。当然,我可能是错的,但这是值得检查的。

有一些情况

  • 您必须处理大量XML数据-序列化程序可能会覆盖您的内存。对于一个包含2000个左右表的数据库转储的简单模式,我有过一次这样的经历。只有一大堆类,但最终序列化不起作用——我不得不使用SAX流解析器

除此之外,在正常情况下,我看不到任何。处理XML序列化程序比使用较低级别的解析器容易得多,尤其是对于更复杂的数据。

使用
XmlSerializer时有许多限制:

  • 您必须有一个公共的无参数构造函数(正如idlewire在注释中提到的,它不必是公共的)
  • 只有公共属性被序列化
  • 无法序列化接口类型
  • 还有一些其他的
这些约束通常会迫使您做出某些设计决策,而这些决策不是您在其他情况下会做出的。。。一个迫使你做出错误设计决策的工具通常不是一件好事;)


也就是说,当您需要一种以XML格式存储简单对象的快速方法时,它非常方便。我还喜欢这样一个事实,即您可以很好地控制生成的模式。

如果您定期序列化和反序列化相同的类型,并且需要不同平台(如Java、Javascript等)使用这些类型的序列化表示,则XmlSerializer可以为您节省很多麻烦我建议尽可能使用XmlSerializer,因为它可以减轻您自己管理从对象图到XML的转换的大量麻烦

在某些情况下,使用XmlSerializer不是最好的方法。以下是一些案例:

  • 当需要快速转发时,只需处理大量xml数据
    • 改用XmlReader
  • 需要使用XPath在xml文档中执行重复搜索时
  • 当xml文档结构非常随意,并且不符合已知对象模型时
  • 当XmlSerializer强加的要求不满足您的设计要求时:
    • 当您不能拥有默认的公共构造函数时,不要使用它
    • 不能使用xml序列化程序属性定义元素和属性名称的xml变体,以符合必要的xml模式

当您想要传输大量数据且资源非常有限时

是的,我个人使用自动XML序列化—尽管我使用最初引入的DataContractSerializer是因为WCF(能够序列化没有属性的类型非常有用),因为它不在其中嵌入类型。当然,因此,您需要知道在重新加载时反序列化的对象的类型

最大的问题是,如果不在您可能希望写入其数据的类型上实现IXmlSerializable,或者公开序列化程序可以本机处理的其他类型,则很难将其序列化为属性

我想最大的问题是你不能自动序列化接口,因为DCS希望在收到XML后能够再次构造实例。但是,本机支持标准集合接口

总而言之,尽管如此,我发现DCS路线是最快、最无痛的方式

作为一种替代方法,如果您想要完全控制,您还可以研究使用LINQtoXML来读写XML,但是您仍然需要使用它逐个成员地处理类型


在阅读了Jon Skeet新书的早期访问之后,我最近一直在关注这一点(因为我看不出重点,所以像躲避瘟疫一样避免了它)。不得不说——我对XML的易用性印象最深。

我过去经常使用XmlSerializer,并且可能会继续使用它。然而,最大的陷阱是上面已经提到的一个:

序列化程序上的约束(例如对公共成员的约束)1)施加desi