我序列化对象时的StackOverflowError

我想用这种方法seriliaze一个对象:

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(); } 

我有一个exceptionjava.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并在此处输入链接描述

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

你没有发布你的具体类,所以很难发现错误但是
简而言之,任何递归算法都可以溢出堆栈并且堆栈是有限的。
对于深度嵌套的对象图,Java内置serlialization需要过多的堆栈空间。
详细说明参考
http://c2.com/cgi/wiki?JavaSerializationIsBroken
http://c2.com/cgi/wiki?JavaSerializationAndTheStack

-Xss512m-Xss512m添加到Netbeans并且它的工作:D

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