我有一个在Java中的图形结构(“图形”在“边缘和节点”),我试图序列化它。不过,尽管显着增加了JVM堆栈的大小,但我却得到了“StackOverflowException”。我做了一些Google搜索,显然这是一个众所周知的Java序列化限制:它不适用于深层嵌套的对象图,如长链表 - 它为链中的每个链接使用堆栈记录,不要做任何聪明的事情,比如广度优先遍历,因此你很快就会出现堆栈溢出。如何在没有得到StackOverflowException的情况下在Java中序列化图形?
推荐的解决方案是通过覆盖readObject()和writeObject()来自定义序列化代码,但是这对我来说似乎有点复杂。 (这可能也可能不相关,但我在图的每个边上存储了一堆字段,所以我有一个类JuNode
其中包含一个成员ArrayList<JuEdge> links;
,即有2个类涉及,而不是简单的从一个节点到另一个节点的对象引用对于问题的目的应该没有关系)。
我的问题有三个:
(a)为什么Java的实现者不纠正这种限制或者他们已经在使用它? (我不敢相信我是第一个想用java编写一个图表的人)
(b)有没有更好的方法?是否有一些替代默认序列化类的替代方法能够以更聪明的方式实现? (c)如果我最好的选择是用低级代码弄脏我的双手,有人有一个图形序列化java源代码的例子,可以用来学习如何做到这一点吗?
难道是你的图中的一个循环会引发一个不断增长的调用堆栈,试图序列化A - > A.links - > B - > B.links - > A?在这种情况下,我建议先串行化一堆节点,接下来是一堆边缘(使用某种类型的节点ID)。 – helios 2010-04-07 07:58:24
或者编写一个“remember-already-serialized-objects”ObjectOutputStream和ObjectInputStream,它知道它是否在序列化之前序列化一个对象(在序列化时持有一组引用),并且不要将它写两次(以及编写引用... ) – helios 2010-04-07 08:00:22
Helios,序列化机制已经处理对象图中的循环并且不止一次地防止同一对象的序列化。 – Adamski 2010-04-07 09:02:26