我继承了一个项目,其中应用程序的数据模型是一个XML文档。我之前的开发人员已经基于这个xml的模式创建了一个对象模型,然后根据对象模型进行编码。
经过几年的维护,这个应用程序逐渐开始显示它的年龄。该团队负责人表示,这背后的关键原因是由于xml序列化的“缓慢”。我很想在这上面调用BS,但是我们处理的许多xml文件大小超过2MB,并且记住了标有[Serializable]
的对象的幕后工作的基础知识,2MB是一个反思很多,所以慢度理论可能有一些道理。
根据您的经验,序列化对于选择XML非常“慢”/糟糕 - > XPath模型而不是XML - > POCO模型?
BTW这是一个.NET 2.0项目,我们的客户可能将在明年晚些时候升级到.NET 3.5。
答案 0 :(得分:6)
Xml序列化不使用Serializable属性。 xml序列化程序实际上生成一个将xml映射到对象的程序集,它不使用反射。这是Xml序列化仅适用于公众的原因之一。
您可以尝试的一件事是使用属于WCF的DataContractSerializer
进行衡量。看到不同之处会很有趣。
我个人从未遇到过性能限制,但我也没有大型对象,例如你的描述。
需要注意的一件事是你用来创建XmlSerializer
的构造函数,其中一些不会缓存生成的程序集,并且会导致性能损失和内存泄漏,因为每次调用都会产生更多和更多的组件。如果是这种情况,您有两种选择:
1)缓存您创建的序列化程序实例。我相信它是线程安全的,但你想要仔细检查MSDN 2)使用不同的构造函数来创建XmlSerializer。
答案 1 :(得分:6)
总的来说,不,我不认为减速是由于XML序列化造成的; 2MB不是那么大,它不应该导致任何重大减速。
我更关心的是团队负责人告诉您减速的原因,而不给您任何特定的分析信息。显示情况就是这样。关于优化的意见经常是错误的;存在分析是为了精确地找到应用程序中发生减速的位置。我建议对应用程序进行检测和分析,并找出减速的位置;我敢打赌它不在XML序列化中。
答案 2 :(得分:1)
运行探查器并查看大部分CPU时间的使用情况。无论是XML序列化还是其他地方,您都知道在哪里集中精力。此外,为了记录,我在使用Spring RPC时看到Java世界中的XML序列化过去非常缓慢。所以,你的老板当然可能是正确的,但你应该检查,而不是猜测。
答案 3 :(得分:1)
由于此处尚未提及,我想我会指出VS中有一个选项可以在构建时生成XML序列化程序集。
http://msdn.microsoft.com/en-us/library/kb4wyys2(v=VS.100).aspx
如果您想要更精细的控制,也可以手动使用sgen.exe进行生成。
这减少了序列化类型所需的时间,因为正如JoshBerke所说,XmlSerialiser在需要进行serislise或反序列化时会生成一个新的程序集,这对于复杂类型来说可能需要一些时间。因此,预生成序列化程序集可以显着提高性能。