我最近接触过一些代码,这些代码一直使用Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract.getSerializer(typeof(X))
来创建一个新的序列化程序,其中X是被反序列化的对象的类型。在查找文档时,大多数文档都会使用new XmlSerializer(typeof(X))
,而我几乎找不到XmlSerializerContract
上的任何文档(以及我发现的唯一官方文档都与Outlook有关)。
使用Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract.getSerializer()
与new XmlSerializer()
有什么好处?在什么情况下我想要各自使用?
答案 0 :(得分:2)
对于性能优化,XmlSerializer
(和XmlSerializerFactory
)生成包含特定类型的序列化程序的临时程序集。您提到的类型(Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract
)来自这些生成的程序集(请参阅http://treyhutcheson.wordpress.com/2007/02/20/dynamic-interface-implementations/) - 因此您很自然地找不到相同的文档。
坦率地说,对我而言似乎是一些黑客解决方案可能解决memory leak issues相关的XmlSerializer - 除非使用特定的构造函数,否则XmlSerializer将继续生成更多动态程序集,从而增加内存占用量。引自MSDN的相同内容:
动态生成的程序集
提高性能,XML序列化基础架构 动态生成程序集以序列化和反序列化 指定的类型。基础结构查找并重用这些程序集。 仅当使用以下构造函数时才会出现此问题:
XmlSerializer.XmlSerializer(类型):
XmlSerializer.XmlSerializer(Type,String)
如果您使用任何其他构造函数,则使用多个版本 生成相同的装配并且从不卸载,这导致a 内存泄漏和性能不佳。最简单的解决方案是使用一个 前面提到的两个构造函数。否则,你必须 将程序集缓存在Hashtable中,如下所示 示例
我的建议当然是找出使用有关开发人员生成的程序集中的未记录代码的实际原因,但无论是使用XmlSerializer
/ XmlSerializerFactory
还是准备从这些代码迁移 - 你可以如果需要,总是使用您自己的缓存解决方案(如果您不使用这两个特定的构造函数)。不要忘记严格测试您的代码。