XmlSerializerContract.getSerializer() vs. new XmlSerializer(

本文关键字:new XmlSerializer vs getSerializer XmlSerializerContract | 更新日期: 2023-09-27 18:28:09

我最近接触到一些代码,这些代码始终使用Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract.getSerializer(typeof(X))来创建新的序列化程序,其中X是要反序列化的对象的类型。在查找文档时,大多数文档都会使用new XmlSerializer(typeof(X)),而我在XmlSerializerContract上几乎找不到任何文档(我找到的唯一官方文档与Outlook有关)。

使用Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract.getSerializer()new XmlSerializer()有什么好处?我想在什么情况下使用每种方案?

XmlSerializerContract.getSerializer() vs. new XmlSerializer(

为了优化性能,XmlSerializer(和XmlSerializerFactory)为特定类型生成包含序列化程序的临时程序集。您提到的类型(Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract)来自这些生成的程序集(请参阅http://treyhutcheson.wordpress.com/2007/02/20/dynamic-interface-implementations/)-所以你很自然地没有找到任何相同的文档。

坦率地说,对我来说,这似乎是一种破解解决方案,可能可以解决与XmlSerializer相关的内存泄漏问题——除非使用特定的构造函数,否则XmlSerialize器将继续生成更多的动态程序集,从而增加内存足迹。引用MSDN上的相同内容:

动态生成组件

为了提高性能,XML序列化基础结构动态生成要序列化和反序列化的程序集指定的类型。基础结构查找并重用这些程序集。此行为仅在使用以下构造函数时发生:

XmlSerializer.XmlSerializer(类型)

XmlSerializer.XmlSerializer(类型,字符串)

如果使用任何其他构造函数生成了相同的程序集,但从未卸载,这导致内存泄漏和性能差。最简单的解决方案是使用前面提到的两个构造函数中的一个。否则,您必须将程序集缓存在哈希表中,如下所示实例

我的建议是,当然要找出使用相关开发人员生成的程序集中的未记录代码的实际原因,但无论如何,都要准备通过使用XmlSerializer/XmlSerializerFactory从相同的程序集迁移出去——如果需要,您可以随时使用自己的缓存解决方案(以防您没有使用这两个特定的构造函数)。不要忘记严格测试代码。