gpt4 book ai didi

java - 深度图导致堆栈溢出 : non-recursive serialization options?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:56 25 4
gpt4 key购买 nike

我们从 Java 的序列化库中获取 StackOverflowErrors。问题在于默认的序列化实现是递归的,其深度仅受通过引用网络的最长路径的限制。

我们意识到我们可以覆盖默认方法,但我们的项目中有数百个连接丰富的类,因此我们对覆盖方法不感兴趣。如果存在非递归的通用解决方案(或至少将递归从堆栈移至堆),我们会更感兴趣。

我在谷歌上搜索了这个话题,发现只有很多人都在提示同一件事,但这些提示大多是多年前的事了。情况有改善吗?如果没有,我们会编写一个通用的实现,您有什么建议吗?我们假设有一些原因(对我们来说还不是很明显)为什么没有人破解这个坚果。从理论上讲,“正确”地做这件事听起来应该是可行的。

最佳答案

我前阵子遇到过这个问题。对于丰富连接的类,即使您能够在没有堆栈溢出的情况下完成序列化,序列化也非常慢。当我们解决这个问题时,我们有一些类,所以我们创建了自己的序列化格式,将数据打包成一组整数对象 id,每个字段都有整数字段 id,并通过一系列对象 id 描述它们之间的联系, 字段 id, 其他对象 id 映射。这种自定义方法速度非常快,而且占用内存极少,但只有在您想要序列化一小组类时才真正有效。

一般情况要困难得多,对富连接类的序列化需求不是那么强烈,所以我猜这就是为什么没有人解决它的原因。

不过,您基本上已经解决了这个问题,您将始终需要一个等于深度优先搜索树的最大高度的堆栈深度,因此只要您的图表比这更深,您就会遇到堆栈溢出。它本质上是一个递归问题,因此您将需要使用递归或假递归,方法是将堆栈分配移动到您放在堆上的 Stack 对象。我会看一下 OpenJDK 实现:

http://hg.openjdk.java.net/jdk6/jdk6-gate/jdk/file/tip/src/share/classes/java/io/ObjectOutputStream.java

您已经有一个 DebugTraceInfoStack,我将为您正在编写的当前对象创建第二个 Stack 字段,并更改 writeObject0 方法以将对象压入堆栈,如下所示:

stack.push(obj);
while(!stack.empty()) {
obj = stack.pop();
...

然后你只需将所有调用更改为 writeObject0(x);到 stack.push(x);。递归和迭代之间的简单、标准转换,除了该类几乎有 2500 行并且可能有大量陷阱。

如果您最终构建了它,我建议将其作为补丁提交到下一版本的 java,因为它会很有用,例如用于深度对象图的 IterativeObjectOutputStream。

关于java - 深度图导致堆栈溢出 : non-recursive serialization options?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7439325/

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