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

导致错误的两个类是: pastebin.com/Sb3X0Quq在此处输入链接描述

4

4 回答 4

4

CRDT 是被序列化的 Object m 的超类。错误是派生自 CRDT 的类似乎有对自身的引用,导致无限递归
您在堆栈跟踪中看到了这一点。
Tipp 通过使用调试器或在您的 serialize() 方法的开头添加 System.out.println(m.getClass()) 找出对象 CRDT m: 的类。然后,当您知道该类时,请检查该对象是否具有对其自身的引用。

于 2012-11-24T14:18:37.213 回答
1

您还没有发布具体的类,因此很难发现错误,但
简而言之,任何递归算法都可能溢出堆栈并且堆栈是有限的。
对于深度嵌套的对象图,Java 内置序列化需要过多的堆栈空间。
有关详细信息,请参阅
http://c2.com/cgi/wiki?JavaSerializationIsBroken
http://c2.com/cgi/wiki?JavaSerializationAndTheStack

于 2012-11-24T14:22:29.590 回答
1

我只是添加-Xss512m到 Netbeans,它的工作:D

于 2012-11-25T15:05:17.930 回答
0

顺便说一句,我有同样的问题,但看起来我的与检查点持续时间太大有关。看起来,Spark 在写出它时会维护某种对象链接,如果持续时间太大,它将导致堆栈溢出。

于 2015-05-27T22:32:21.970 回答