C# XmlSerializerContract.getSerializer()与新XmlSerializer()的比较

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

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


使用
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract.getSerializer()与
newxmlserializer()相比,有哪些好处?在什么情况下我希望使用每种方法?

为了优化性能,
XmlSerializer
(和
XmlSerializerFactory
)为特定类型生成包含序列化程序的临时程序集。您提到的类型(
Microsoft.Xml.Serialization.GeneratedAssembly.xmlsializercontract
)来自这些生成的程序集(请参阅),因此很自然,您没有找到任何与此相关的文档

坦率地说,在我看来,解决相关的XmlSerializer似乎是一种黑客解决方案——除非使用特定的构造函数,否则XmlSerializer将继续生成更动态的程序集,从而增加内存足迹。引自同一条:

动态生成的程序集

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

XmlSerializer.XmlSerializer(类型)

XmlSerializer.XmlSerializer(类型,字符串)

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


我的建议当然是找出使用来自相关开发人员生成的程序集的未记录代码的实际原因,但不管如何,请准备使用
XmlSerializer
/
XmlSerializerFactory
-如果需要,您始终可以使用自己的缓存解决方案(如果您没有使用这两个特定的构造函数)。不要忘记严格测试代码。

为了优化性能,
XmlSerializer
(和
XmlSerializerFactory
)为特定类型生成包含序列化器的临时程序集。您提到的类型(
Microsoft.Xml.Serialization.GeneratedAssembly.xmlsializationrcontract
)来自这些生成的程序集(请参阅),因此很自然,您还没有找到任何相关文档

坦率地说,在我看来,解决相关XmlSerializer似乎是一种黑客解决方案——除非使用特定的构造函数,否则XmlSerializer将继续生成更多动态程序集,从而增加内存足迹。引自:

动态生成的程序集

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

XmlSerializer.XmlSerializer(类型)

XmlSerializer.XmlSerializer(类型,字符串)

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


我的建议当然是找出使用来自相关开发人员生成的程序集的未记录代码的实际原因,但不管如何,请准备使用
XmlSerializer
/
XmlSerializerFactory
-如果需要,您始终可以使用自己的缓存解决方案(如果你没有使用这两个特定的构造函数)。别忘了严格测试你的代码。

令人惊讶的答案。感谢你提供了如此彻底(并且有很好的文档记录)的响应!这帮了我很大的忙。令人惊讶的答案。感谢你提供了如此彻底(并且有很好的文档记录)的响应!这帮了我很大的忙。