在 Java 中序列化对象时出现 StackOverflowError [英] StackOverflowError when serializing an object in Java

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

问题描述

我正在使用 Swing 用 Ja​​va 编写应用程序.我正在尝试实现在我运行的模拟中保存和加载模拟状态的功能.整个模拟保持为一个对象,与 Swing 断开连接.我正在尝试使用以下代码序列化我的 Simulation 类:

public void saveSimulationState(String simulationFile) {尝试 {可序列化对象 = this.sm;ObjectOutputStream objstream = new ObjectOutputStream(new FileOutputStream(simulationFile));objstream.writeObject(object);objstream.close();} catch (IOException e) {System.out.println(e.getMessage());}}

但我收到以下错误(很大).

线程AWT-EventQueue-0"中的异常 java.lang.StackOverflowError在 java.io.ObjectStreamClass.processQueue(ObjectStreamClass.java:2234)在 java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:266)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1106)在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)在 java.util.ArrayList.writeObject(ArrayList.java:570)在 sun.reflect.GeneratedMethodAccessor6.invoke(未知来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在 java.lang.reflect.Method.invoke(Method.java:597)在 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)在 java.util.ArrayList.writeObject(ArrayList.java:570)在 sun.reflect.GeneratedMethodAccessor6.invoke(未知来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在 java.lang.reflect.Method.invoke(Method.java:597)在 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)在 java.util.ArrayList.writeObject(ArrayList.java:570)在 sun.reflect.GeneratedMethodAccessor6.invoke(未知来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在 java.lang.reflect.Method.invoke(Method.java:597)在 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)在 java.util.ArrayList.writeObject(ArrayList.java:570)在 sun.reflect.GeneratedMethodAccessor6.invoke(未知来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在 java.lang.reflect.Method.invoke(Method.java:597)在 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)在 java.util.ArrayList.writeObject(ArrayList.java:570)在 sun.reflect.GeneratedMethodAccessor6.invoke(未知来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在 java.lang.reflect.Method.invoke(Method.java:597)在 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)在 java.util.ArrayList.writeObject(ArrayList.java:570)在 sun.reflect.GeneratedMethodAccessor6.invoke(未知来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在 java.lang.reflect.Method.invoke(Method.java:597)在 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)在 java.util.ArrayList.writeObject(ArrayList.java:570)在 sun.reflect.GeneratedMethodAccessor6.invoke(未知来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在 java.lang.reflect.Method.invoke(Method.java:597)在 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)在 java.util.ArrayList.writeObject(ArrayList.java:570)在 sun.reflect.GeneratedMethodAccessor6.invoke(未知来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在 java.lang.reflect.Method.invoke(Method.java:597)在 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)

谁能告诉我是什么导致了这个异常?

解决方案

来自 Chen 的有趣帖子:

调试堆栈溢出时,要关注重复递归部分

就你而言:

 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)在 java.util.ArrayList.writeObject(ArrayList.java:570)在 sun.reflect.GeneratedMethodAccessor6.invoke(未知来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在 java.lang.reflect.Method.invoke(Method.java:597)在 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)

<块引用>

如果您在缺陷跟踪数据库中寻找这是否是一个已知问题,那么搜索堆栈中的顶级函数不太可能找到任何有趣的东西.那是因为堆栈溢出往往发生在递归的随机点;即使它们是相同的堆栈溢出,每个堆栈溢出在表面上看起来也与其他每个堆栈溢出不同.

<块引用>

一旦你摆脱了最初的混乱,堆栈跟踪就会变成一个很好的重复模式,由一遍又一遍的相同 x 函数组成.
确定重复模式的开始并不重要,因为每次碰撞的起点都会不同,就像超出您歌唱范围的精确音符因碰撞而异一样.

<块引用>

一旦你确定了重复部分,从中挑选一个有点不寻常的函数并在 你的缺陷数据库.

例如,默认ArrayList 序列化.

这里是您的 GrahPanel 指的是 Simulation 指的是 Graph,可能很长ArrayList Sensor 和 Edge...

<块引用>

Java 序列化保留写入流的每个对象的记录.如果第二次遇到同一个对象,只会将它的引用写入流,而不是对象的第二个副本;所以循环引用不是这里的问题.

<块引用>

但是对于某些类型的结构,序列化容易出现堆栈溢出;例如,一个没有特殊 writeObject() 方法的长链表将通过递归写入每个链接来序列化.如果您有 100,000 个链接,您将尝试使用 100,000 个堆栈帧,并且很可能会因 StackOverflowError 失败.

<块引用>

可以为这样的列表类定义 writeObject() 方法,当第一个链接被序列化时,只需遍历列表并迭代地序列化每个链接;这将阻止使用默认的递归机制.

I am writing an application in Java using Swing. I am trying to implement functionality to save and load simulation states for at simulation i am running. The entire simulation is kept as an object, disconnected from Swing. I am trying to serialize my Simulation class with this code:

public void saveSimulationState(String simulationFile) {
    try {
        Serializable object = this.sm;
        ObjectOutputStream objstream = new ObjectOutputStream(new FileOutputStream(simulationFile));
        objstream.writeObject(object);
        objstream.close();
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}

But i get the following error (it is huge).

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
        at java.io.ObjectStreamClass.processQueue(ObjectStreamClass.java:2234)
        at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:266)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1106)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        at java.util.ArrayList.writeObject(ArrayList.java:570)
        at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        at java.util.ArrayList.writeObject(ArrayList.java:570)
        at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        at java.util.ArrayList.writeObject(ArrayList.java:570)
        at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        at java.util.ArrayList.writeObject(ArrayList.java:570)
        at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        at java.util.ArrayList.writeObject(ArrayList.java:570)
        at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        at java.util.ArrayList.writeObject(ArrayList.java:570)
        at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        at java.util.ArrayList.writeObject(ArrayList.java:570)
        at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        at java.util.ArrayList.writeObject(ArrayList.java:570)
        at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)

Can anybody tell me what is causing this exception?

解决方案

Interesting post from Chen:

When debugging a stack overflow, you want to focus on the repeating recursive part

In your case:

        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        at java.util.ArrayList.writeObject(ArrayList.java:570)
        at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)

If you go hunting through your defect tracking database trying to see whether this is a known issue or not, a search for the top functions on the stack is unlikely to find anything interesting. That's because stack overflows tend to happen at a random point in the recursion; each stack overflow looks superficially different from every other one even if they are the same stack overflow.

Once you get past the initial turmoil, the stack trace settles down into a nice repeating pattern consisting of the same x functions over and over again.
Identifying the start of the repeating pattern isn't important, because the starting point will be different for each crash, in the same way that the precise note which exceeds your singing range varies from crash to crash.

Once you've identified the repeating part, pick a function from it that is somewhat unusual and search for it in your defect database.

For example, an default ArrayList serialization.

Here your GrahPanel refers a Simulation which refers to Graph, with potentially long ArrayList of Sensor and Edge...

Java serialization keeps a record of every object written to a stream. If the same object is encountered a second time, only a reference to it is written to the stream, and not a second copy of the object; so circular references aren't the problem here.

But serialization is vulnerable to stack overflow for certain kinds of structures; for example, a long linked list with no special writeObject() methods will be serialized by recursively writing each link. If you've got a 100,000 links, you're going to try to use 100,000 stack frames, and quite likely fail with a StackOverflowError.

It's possible to define a writeObject() method for such a list class that, when the first link is serialized, simply walks the list and serializes each link iteratively; this will prevent the default recursive mechanism from being used.

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

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