我有一個在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