2009-05-21 49 views
6

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

经过几年的维护,此应用程序已逐渐显示其年龄。该团队负责人表示,背后的关键原因是由于xml序列化的“缓慢”。我很想在这方面给BS打电话,但是我们处理的许多xml文件的大小都超过2MB,并且记住后面带有标记为[Serializable],2MB的对象的基本知识,这是很多需要反思的内容所以慢速度理论可能会有一些事实。

根据您的经验,序列化真的很慢,不适合选择XML - > XPath模型而不是XML - > POCO模型?

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

回答

6

一般来说,不,我不认为放缓是由于XML序列化; 2MB并不是那么大,它不应该导致任何主要的放缓。

我会更关心的是团队领导告诉你什么是放缓是由于没有给你任何具体的分析信息向你显示的情况。关于优化的观点常常是错误的;分析存在的目的是精确查找应用程序中发生任何放缓的位置。我会推荐测试和分析应用程序,并找出经济放缓的地方;我敢打赌它不在XML序列化中。

6

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

您可以尝试的一件事是使用属于WCF的DataContractSerializer进行测量。看到差异会很有趣。

我从来没有遇到性能限制个人,但我也没有大的对象,如你的描述。

有一点需要注意的是你用来创建XmlSerializer的构造函数,其中一些不会缓存生成的程序集,并且会导致性能和内存泄漏的损失,因为每次调用都会生成越来越多的程序集。如果是这种情况,你有两种选择:1)缓存你创建的序列化器实例。我相信这是线程安全的,但你会想要仔细检查MSDN。
2)用户使用不同的构造函数来创建XmlSerializer。

+0

+1很好的答案。另外,我记得在DataContractSerializer上看到了一些基准测试结果,平均比XmlSerializer快10%。 – womp 2009-05-21 16:41:45

1

运行一个分析器并查看大部分CPU时间都花费在哪里。无论它是XML序列化还是其他地方,你都会知道在哪里集中精力。另外,为了记录,在使用Spring RPC时,我已经看到过去在Java世界中XML序列化的速度惊人地慢。所以,你的老板肯定是对的,但不要猜测,你应该检查一下。

1

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

http://msdn.microsoft.com/en-us/library/kb4wyys2(v=VS.100).aspx

你也可以手动sgen.exe使用,如果你想更细粒度的控制做的产生。

这可以减少序列化类型所需的时间,因为正如JoshBerke所说的,XmlSerialiser在需要serislise或deserialise时会生成一个新的程序集,这对于复杂的类型可能需要时间。预先生成序列化程序集可以实现显着的性能改进。