gpt4 book ai didi

java - 如何在不获取 StackOverflowException 的情况下在 Java 中序列化图形?

转载 作者:行者123 更新时间:2023-11-30 11:59:27 24 4
gpt4 key购买 nike

我在 Java 中有一个图形结构(“图形”在“边和节点”中),我正在尝试对其进行序列化。但是,尽管显着增加了 JVM 堆栈大小,但我得到了“StackOverflowException”。我做了一些谷歌搜索,显然这是 java 序列化的一个众所周知的限制:它不适用于深度嵌套的对象图,例如长链接列表 - 它为链中的每个链接使用堆栈记录,并且它不会'不要做任何聪明的事情,例如广度优先遍历,因此您很快就会发生堆栈溢出。

推荐的解决方案是通过覆盖 readObject() 和 writeObject() 来自定义序列化代码,但这对我来说似乎有点复杂。

(它可能相关也可能不相关,但我在图中的每条边上存储了一堆字段所以我有一个类 JuNode 包含一个成员 ArrayList<JuEdge> links; ,即涉及 2 个类,而不是从一个节点到另一个节点的普通对象引用。对于问题的目的来说应该无关紧要)。

我的问题有三个:
(a) 为什么 Java 的实现者不纠正这个限制或者他们已经在着手解决这个问题? (我不敢相信我是第一个想用 Java 序列化图形的人)
(b) 有没有更好的方法?是否有一些替代默认序列化类的替代品以更聪明的方式执行此操作?
(c) 如果我最好的选择是用低级代码弄脏我的手,有人有图形序列化 java 源代码的例子可以用来学习如何做吗?

最佳答案

虽然可以优化,但 Java 序列化规范从根本上讲是递归的。您可以而且通常会提供一个writeObject(和readObject)方法。在执行时,必须写入引用的对象。即使可以进行广度优先遍历,也无济于事。

Sun/Oracle JDK 是开源的,并且对贡献开放。

java.util.LinkedList 将有一个如何高效序列化链表的示例。

关于java - 如何在不获取 StackOverflowException 的情况下在 Java 中序列化图形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2590585/

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