我序列化对象时的StackOverflowError [英] StackOverflowError when i serialize an object

查看:118
本文介绍了我序列化对象时的StackOverflowError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用这种方法来保护一个对象:

I want to seriliaze an object with this method :

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

I read some forum that i need to reimplementing the writeObject / readObject methods. Is it the only possible solution ? and how to reimplementing the writeObject / readObject

我要序列化的对象是:
http://pastebin.com/D1kEidtn

My object to serialize is : http://pastebin.com/D1kEidtn

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

Two class that cause errors are : pastebin.com/Sb3X0Quq and enter link description here

推荐答案

CRDT是超类被序列化的对象m。
错误是从CRDT派生的类似乎有自己的引用,导致无限递归

你在堆栈跟踪中看到。

Tipp找出对象CRDT m的类:通过使用调试器,或在serialize()方法的beginn处添加System.out.println(m.getClass())。
然后当你知道这个类时,检查对象是否有对它自己的引用。

CRDT is the superclass of the Object m which is serialized. The error is that the class that derives from CRDT seems to have a reference to itself, leading to an endless recursion
You see that in the stack trace.
Tipp find out the class of The object CRDT m: by either using the debugger, or adding an System.out.println(m.getClass()) at the beginn of your serialize() method. Then when you know the class, check wheter the object has a reference to itself.

这篇关于我序列化对象时的StackOverflowError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆