序列化或序列化会话中的Wicket StackOverflowError

时间:2014-07-27 13:35:06

标签: java serialization wicket stack-overflow

我使用的是Wicket 6.15,我的程序中出现以下异常

java.lang.StackOverflowError
    at java.lang.Exception.<init>(Exception.java:102)
    at java.lang.ReflectiveOperationException.<init>(ReflectiveOperationException.java:89)
    at java.lang.reflect.InvocationTargetException.<init>(InvocationTargetException.java:72)
    at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:398)
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:361)
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.checkFields(CheckingObjectOutputStream.java:645)
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:569)
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:361)
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.checkFields(CheckingObjectOutputStream.java:645)
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:569)
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:361)
...

我不知道什么会导致wicket-core中的StackOverFlow。

我搜索此异常并发现这些异常部分属于Serialization。所以我检查了所有对象,并且所有对象都实现了Serializable

另一个有趣的问题是这个例外在第一次没有发生,它发生在我尝试渲染组件2或3次之后。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

可能的问题是您在会话中存储的对象内部有自包含对象或可能的配对参考周期。 对不起,我无法发表评论,但想帮助你。

答案 1 :(得分:0)

添加您自己的观察结果只有在发生错误后才使用CheckingObjectOutputStream:CheckingObjectOutputStream应该捕获循环引用,但是如果要序列化的对象有错误的equals()方法,则此安全措施可能会失败 - 可能你检查一下吗?

除此之外,我认为CheckingObjectOutputStream可能想要使用getter方法而不是直接访问字段,因此实际上每次创建一个新对象的getter方法将产生无限的,而不是循环的数据结构。但是,据我所知,CheckingObjectOutputStream代码,它不使用getter方法,但直接访问字段,所以我认为这不是导致问题的原因。