gpt4 book ai didi

.net - OutOfMemoryError 调用 XmlSerializer.Deserialize() - 与 XML 大小无关!

转载 作者:行者123 更新时间:2023-12-04 07:45:48 26 4
gpt4 key购买 nike

这是一个非常疯狂的错误。以下是抛出OutOfMemoryException ,对于非常简短和简单的 XML 片段(例如, <ABC def='123'/> ):

public static T DeserializeXmlNode<T>(XmlNode node)
{
try
{
return (T)new XmlSerializer(typeof(T))
.Deserialize(new XmlNodeReader(node));
}
catch (Exception ex)
{
throw; // just for catching a breakpoint.
}
}

我读了 this MSDN article如果我在构造函数中使用带有附加参数的 XmlSerializer,我最终会在每次调用时生成未缓存的序列化程序程序集,从而导致程序集泄漏。但我没有在构造函数中使用额外的参数。它也发生在第一次在新启动的 AppDomain 中被调用时,所以这也没有意义。

是什么赋予了?

最佳答案

好吧,我的问题的最终答案不会帮助遇到此问题的每个人,但我的一些同事在几个月后也遇到了使用不同产品的不同系统。几个月后,当他们在 SO 上找到我的帖子时,他们笑了,想知道我是否真的解决了这个问题,因为这里没有接受任何解决方案。

最终的解决方案与反序列化问题无关。相反,它涉及完全卸载和安装 Oracle ODP.NET 的全新副本。数据库客户端,提供者很多,如果不是我们所有的应用程序都使用。

根据轶事证据,这个问题似乎出现在 ODP.NET 程序集的不正确修补版本上,随后通过虚拟机克隆传播到其他系统。

当 ODP.NET 被完全删除,并从 Oracle 网站检索并安装一个新的兼容版本时,问题完全消失了。

假设是一个可用(但已损坏)的 ODP.NET 驱动程序具有不安全的代码,并且会重复覆盖 Deserialize 附近的 .NET protected 内存区域。第一次使用后的方法。如 Deserialize在任何 ODP.NET 调用之前被调用,它会工作得很好。但是,在使用任何 ODP.NET 调用之后对 Deserialize 的所有后续调用都将失败。

现在已在两个不同的产品中两次解决此问题的最终解决方案是安装 ODP.NET 的良好/新鲜/干净/新副本。

不漂亮……但这就是解决问题的方法。

关于.net - OutOfMemoryError 调用 XmlSerializer.Deserialize() - 与 XML 大小无关!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2823205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com