我刚刚了解了.Net中的XmlSerializer类。在我总是使用标准类解析和编写XML之前。在我深入研究之前,我想知道是否有任何不适合的选择。
编辑:标准类我指的是XmlDocument,XmlElement,XmlAttribute ......等。
答案 0 :(得分:11)
使用XmlSerializer
时有许多限制:
这些约束通常会迫使你做出某些设计决策,这些设计决定不是你在其他情况下所做的那些......而且一个迫使你做出糟糕设计决定的工具通常不是一件好事;)
话虽这么说,当你需要一种快速的方式来存储XML格式的简单对象时,它会非常方便。我也喜欢你对生成的模式有很好的控制权。
答案 1 :(得分:5)
嗯,显然,它并没有给你足够的控制输出。就我个人而言,我发现LINQ to XML使得手动编写它非常容易,我很乐意这样做,至少对于相当小的项目。如果您使用的是.NET 3.5或4但不使用LINQ to XML,请立即查看它 - 它比旧的DOM更好 。
有时能够控制序列化和反序列化是很好的...尤其是当您更改数据的布局时。如果你不是在那种情况下并且没有预料到它,那么内置的XML序列化可能会没问题。
编辑:我不认为 XML序列化支持构建真正的不可变类型,而这显然可以通过手工构建来实现。由于我是不变性的粉丝,这绝对是我所关注的事情。如果您实施IXmlSerializable
我相信您可以使用公共不变性,但您仍然必须是私人可变的。当然,我可能错了 - 但值得检查。
答案 2 :(得分:5)
如果您经常对相同类型进行序列化和反序列化,并且需要这些类型的序列化表示可供不同平台(即Java,Javascript等)使用,那么XmlSerializer可以为您省去很多麻烦。建议尽可能使用XmlSerializer,因为它可以减轻相当大的麻烦,试图自己管理从对象图到XML的转换。
在某些情况下,使用XmlSerializer并非最佳方法。以下是一些案例:
答案 3 :(得分:4)
我发现XmlSerializer的主要缺点是:
1)对于涉及集合的复杂对象图,有时很难通过使用序列化控制属性来获得所需的XML模式。
2)如果您更改应用程序的一个版本与下一个版本之间的类定义,则您的文件将变得不可读。
答案 4 :(得分:2)
是的,我个人使用自动XML序列化 - 虽然我最初使用的DataContractSerializer因为WCF而引入(能够序列化没有属性的类型非常有帮助)因为它没有嵌入类型。当然,您需要知道在重新加载时要反序列化的对象类型。
最大的问题是,如果没有在可能要编写其数据类型的类型上实现IXmlSerializable,或者暴露序列化程序可以本机处理的其他类型,则很难序列化为属性。
我想最大的问题是你无法自动序列化接口,因为DCS希望能够在收到XML时再次构造实例。但是,本机支持标准集合接口。
总而言之,我发现DCS路线是最快,最无痛的方式。
作为替代方案,您还可以调查使用Linq to XML来读取和编写XML(如果您想要完全控制) - 但是您仍然必须逐个成员地处理类型。
我最近一直在关注这个问题(因为我无法看到这一点,因为我无法看到这一点),因为他已经阅读了Jon Skeet新书的早期访问权。不得不说 - 我对使用XML很容易让我印象深刻。
答案 5 :(得分:1)
我过去经常使用XmlSerializer,可能会继续使用它。然而,最大的陷阱是上面已经提到的:
对序列化程序的约束(例如对公共成员的限制)要么1)对与其主要功能无关的类施加设计约束,要么2)强制增加处理这些约束的复杂性。 / p>
当然,其他Xml序列化方法也会增加复杂性。
所以我想我的答案是,没有适合所有情况的正确或错误答案;选择序列化方法只是其中许多设计考虑因素之一。
答案 6 :(得分:0)
Thera有些情况。
除此之外 - 在正常情况下我没有看到任何情况。处理XML Serializer比使用更低级别的解析器更容易,特别是对于更复杂的数据。
答案 7 :(得分:-1)
当您想要传输大量数据时,您的资源非常有限。