2

这是代码(简化):

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 的某个地方。

有任何想法吗?谢谢!

4

5 回答 5

3

my.pkg.page.ListPage$1将是一个匿名的内部类。序列化嵌套类在最好的时候并不是一个好主意(映射到完整的 JVM 名称和处理“外部 this”引用)。

该异常看起来好像是在尝试查找派生度最高的非Serializable基类的无参数构造函数,而派生度最小的类必须可以访问该构造函数Serializable

于 2010-08-26T13:48:44.267 回答
2

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

于 2010-08-26T14:07:23.913 回答
1

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

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

于 2010-08-26T14:55:32.283 回答
0

您正在尝试序列化一个抽象类,根据定义,它不能被实例化。也就是说,根据您对 ListPage 的定义,您不能这样做:

ListPage l = new ListPage();

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

于 2010-08-26T13:32:20.713 回答
0

一个序列化对象,而不是类,不是吗?您展示的所有类都是抽象的,因此无法实例化,那么您正在(反)序列化的是什么?

该错误将该类引用为“ListPage$1”——一个匿名内部类。我认为我们需要查看更多代码才能了解发生了什么。

于 2010-08-26T13:38:47.837 回答