2017-06-04 40 views
1

我的程序中的一個類有一個LinkedList,它通常包含大量的元素。在序列化這個類時,發生了一個Stackoverflow錯誤。我明白這是由於序列化列表中的鏈接的遞歸方式。所以我想重寫這個列表的writeObject以迭代的方式,但我不知道如何做到這一點。如何序列化沒有stackoverflow錯誤的大型列表?

+0

可能重複https://stackoverflow.com/questions/12963445/serialization-readobject-writeobject-overrides – user7294900

+1

ArrayList序列化,無遞歸。我猜想由於列表元素的結構,發生了飽和溢出。 – laune

+0

我想你有你自己的列表實現,因爲LinkedList沒有這個問題。我建議你看一下LinkedList的源代碼,看看它們是如何實現的。 (或使用內置的LinkedList)我很驚訝有人知道如何編寫自定義序列化,但不知道如何在不遞歸的情況下遍歷鏈表。 –

回答

1

如果要素之一是具有參考MYOBJECT例如你的對象爲MyObject:

public class MyObject implements Serializable { 
    private MyObject nextObject; 
    public void setNextObject(MyObject nextObject) { 
    this.nextObject = nextObject; 
... 
} 

如果每個MyObject來鏈接到下/上一myObject的序列化進程將: 開始寫第一MyObject來之前它完成編寫第一個它將開始寫第二個MyObject等等,直到最後一個對象。

此結構可能導致大量元素的序列化stackoverflow異常。

解決方法是保存下一個對象的唯一標識爲:private int nextObjectId;

+0

很好的解釋,謝謝。 – user3025839

+0

我可以進一步問,在這種情況下你會如何重寫writeObject函數? – user3025839

+0

我有類似的問題,我切換到保存在MyObject int nextObjectId。只需保存下一個對象的鍵而不是整個對象 – user7294900