当从抽象Serializable继承时,为什么我会得到一个InvalidClassException'没有有效的构造函数'?

时间:2010-08-26 13:22:10

标签: java serialization serializable

这是代码(简化):

public abstract class PageBase implements Serializable {
     private static final long serialVersionUID = -31905358958878336L;
}

public abstract class ListPage extends PageBase {

    public Controller getController() {
         // Controller is a class
         // that implements Serializable and does have an def. constr.
         return new Controller() {
              @Override
              public void someMethod() {
                  // DoSomething
              }
         };
    }
}

public class ProjectList extends ListPage {
}

并通过反序列化抛出:

java.io.InvalidClassException: my.pkg.page.ListPage$1; no valid constructor

反序列化正在IBM JSF-Code中的某个地方进行。

有什么想法吗?谢谢!

5 个答案:

答案 0 :(得分:3)

my.pkg.page.ListPage$1将是一个匿名的内部类。在最好的情况下,Serialisaing嵌套类不是一个好主意(糟糕的映射到完整的JVM名称和处理“外部”引用)。

该异常看起来好像是在尝试查找派生最多的非Serializable基类的无参数构造函数,该类必须可由最少派生的Serializable类访问。

答案 1 :(得分:2)

我建议将匿名Controller定义为单独的类。

答案 2 :(得分:1)

我认为问题是Controller的子类是一个非静态内部类,因此它的构造函数有一个隐式参数,它引用了封闭类的实例。这使得构造函数不能用于对象反序列化。

尝试序列化这些对象是一个坏主意,但如果更改内部类以使其static反序列化可能会起作用。

答案 3 :(得分:0)

您正在尝试序列化一个抽象类,根据定义,该抽象类无法实例化。 也就是说,使用ListPage的定义,你不能这样做:

ListPage l = new ListPage();

从ListPage和ProjectList中删除抽象限定符,一切都会好的。

答案 4 :(得分:0)

一个序列化对象,而不是类,不是吗?你所展示的所有类都是抽象的,所以不能实例化,那么你(de)序列化是什么?

该错误将该类引用为“ListPage $ 1” - 一个匿名内部类。我想我们需要看到更多代码来了解正在发生的事情。