2

このメソッドでオブジェクトをシリアライズしたい:

public void serializ(CRDT m) throws IOException {
    ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
    ObjectOutputStream stream = new ObjectOutputStream(byteOutput);
    stream.writeObject(m);
    sumMemory = byteOutput.size();

    stream.flush();
    stream.close();
    byteOutput.flush();
    byteOutput.close();
}

例外がありますjava.lang.StackOverflowError

Exception in thread "main" java.lang.StackOverflowError
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1169)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
    ...

writeObject / readObjectメソッドを再実装する必要があるフォーラムを読みました。それが唯一の可能な解決策ですか?および再実装する方法writeObject / readObject

シリアル化する私のオブジェクトは次のとおりです。 http://pastebin.com/D1kEidtn

エラーの原因となる 2 つのクラスは、 pastebin.com/ Sb3X0Quqで、ここにリンクの説明を入力してください

4

4 に答える 4

4

CRDT はシリアライズされた Object m のスーパークラスです。エラーは、CRDT から派生したクラスがそれ自体への参照を持っているように見え、無限の再帰につながること
です。スタック トレースで確認できます。
ヒント オブジェクト CRDT m: のクラスを見つけるには、デバッガーを使用するか、serialize() メソッドの先頭に System.out.println(m.getClass()) を追加します。次に、クラスがわかったら、オブジェクトがそれ自体への参照を持っているかどうかを確認します。

于 2012-11-24T14:18:37.213 に答える
1

Netbeansに追加-Xss512mするだけで、動作します:D

于 2012-11-25T15:05:17.930 に答える
1

具体的なクラスを投稿していないため、エラーを見つけるのは難しいですが、
要するに、再帰アルゴリズムはスタックをオーバーフローする可能性があり、スタックは有限です。
深くネストされたオブジェクト グラフの場合、Java 組み込みのシリアル化には過剰なスタック領域が必要です。
詳細については、 http ://c2.com/cgi/wiki?JavaSerializationIsBroken http://c2.com/cgi/wiki?JavaSerializationAndTheStack
を参照してください。

于 2012-11-24T14:22:29.590 に答える
0

ところで、私は同じ問題を抱えていましたが、チェックポイントの期間が長すぎることに関連しているようです。どうやら、Spark は書き込み中にある種のオブジェクト リンケージを維持し、期間が長すぎるとスタック オーバーフローが発生します。

于 2015-05-27T22:32:21.970 に答える