这是代码(简化):
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中的某个地方进行。
有什么想法吗?谢谢!
答案 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” - 一个匿名内部类。我想我们需要看到更多代码来了解正在发生的事情。