Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Design patterns XML序列化很慢_Design Patterns_Serialization_Xml Serialization - Fatal编程技术网

Design patterns XML序列化很慢

Design patterns XML序列化很慢,design-patterns,serialization,xml-serialization,Design Patterns,Serialization,Xml Serialization,我继承了一个项目,其中应用程序的数据模型是XML文档。在我之前的开发人员已经基于xml的模式创建了一个对象模型,然后根据对象模型进行编码 经过几年的维护,此应用程序已逐渐开始显示其年龄。团队负责人说,这背后的关键原因是xml序列化的“缓慢”。我很想在这一点上称之为BS,但我们处理的许多xml文件的大小都超过2MB,请记住标记为[Serializable]的对象在幕后发生的基本情况,2MB需要反思很多,因此慢度理论可能有些道理 根据您的经验,序列化是否真的如此“慢”/糟糕以至于选择XML->XPa

我继承了一个项目,其中应用程序的数据模型是XML文档。在我之前的开发人员已经基于xml的模式创建了一个对象模型,然后根据对象模型进行编码

经过几年的维护,此应用程序已逐渐开始显示其年龄。团队负责人说,这背后的关键原因是xml序列化的“缓慢”。我很想在这一点上称之为BS,但我们处理的许多xml文件的大小都超过2MB,请记住标记为
[Serializable]
的对象在幕后发生的基本情况,2MB需要反思很多,因此慢度理论可能有些道理

根据您的经验,序列化是否真的如此“慢”/糟糕以至于选择XML->XPath模型而不是XML->POCO模型


顺便说一句,这是一个.NET 2.0项目,我们的客户可能会在明年晚些时候升级到.NET 3.5。

Xml序列化不使用Serializable属性。xml序列化程序实际上生成一个将xml映射到对象的程序集,它不使用反射。这是Xml序列化仅适用于Public的原因之一

您可以尝试使用作为WCF一部分的
DataContractSerializer
进行测量。看到差别会很有趣

我个人从来没有遇到过性能限制,但我也没有像您这样的大型对象

需要注意的一点是用于创建
XmlSerializer
的构造函数,其中一些构造函数不会缓存生成的程序集,并且会导致性能损失和内存泄漏,因为每次调用都会生成越来越多的程序集。如果是这种情况,您有两种选择:

1) 缓存您创建的序列化程序实例。我相信它是线程安全的,但您需要再次检查MSDN。

2) 使用不同的构造函数来创建XmlSerializer。

一般来说,不,我不认为速度放缓是由于XML序列化;2MB并没有那么大,也不应该造成任何重大减速


我更关心的是,团队负责人会告诉你减速的原因,而不给你任何具体的分析信息,告诉你情况就是这样。关于优化的观点经常是错误的;分析的目的在于准确地发现应用程序中的任何减速情况。我建议对应用程序进行检测和分析,并找出放缓的原因;我敢打赌它不在XML序列化中。

运行一个探查器,看看大部分CPU时间都花在哪里了。无论结果是XML序列化还是其他方面,您都知道应该将精力集中在哪里。另外,在过去的Java世界中,当使用SpringRPC时,我看到XML序列化速度惊人地慢。所以,你的老板肯定是对的,但你应该检查一下,而不是猜测。

因为这里还没有提到,我想我应该指出,VS中有一个选项可以在构建时生成XML序列化程序集

如果需要更细粒度的控制,还可以手动使用sgen.exe来生成


这减少了序列化类型所需的时间,因为正如JoshBerke上面所说的,XmlSerialiser在需要序列化或反序列化时会生成一个新程序集,这对于复杂类型来说可能需要时间。因此,预生成序列化程序集可以显著提高性能。

+1答案很好。顺便说一句,我记得在DataContractSerializer上看到一些基准测试,显示它平均比XmlSerializer快10%左右;除非使用反射,否则无法获取类型详细信息。现在,这些细节不必重复使用,但必须首先获得。此外,
DataContractSerializer
不是WCF的一部分;WCF充分利用了它,但它位于WCF之外(在它自己的命名空间和程序集中)。@casperOne XML序列化程序使用反射,正如您第一次所说的,假设您调用了正确的构造函数,它将缓存生成的程序集。我相信你也可以在编译时生成这个time@JoshBerke:我注意到它不必在评论中重复使用;我相信您是对的,它可以在编译时生成。关于
DataContractSerializer
的注释也是正确的,它不是WCF的一部分。