我想用这个方法序列化一个对象:
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 http://pastebin.com/D1kEidtn
导致错误的两个类是:Pastebin.com/Sb3X0Quq http://www.pastebin.com/Sb3X0Quq and 在此输入链接描述 http://www.pastebin.com/cw15LQ1z
CRDT 是序列化对象 m 的超类。
错误是从CRDT派生的类似乎有对自身的引用,导致无限递归
您可以在堆栈跟踪中看到这一点。
Tipp 通过使用调试器或在 serialize() 方法的开头添加 System.out.println(m.getClass()) 来找出对象 CRDT m: 的类。
然后,当您知道该类时,检查该对象是否具有对其自身的引用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)