Java 为什么我会得到一个InvalidClassException';没有有效的构造函数';何时从抽象序列化文件继承?

Java 为什么我会得到一个InvalidClassException';没有有效的构造函数';何时从抽象序列化文件继承?,java,serialization,serializable,Java,Serialization,Serializable,以下是代码(简化): 通过反序列化,它抛出: java.io.InvalidClassException: my.pkg.page.ListPage$1; no valid constructor 反序列化发生在IBMJSF代码中的某个地方 有什么想法吗?谢谢 您正在尝试序列化一个抽象类,根据定义,该抽象类无法实例化。 也就是说,根据ListPage的定义,您不能执行以下操作: ListPage l=新ListPage() 从ListPage和ProjectList中删除抽象限定符,一切都会好

以下是代码(简化):

通过反序列化,它抛出:

java.io.InvalidClassException: my.pkg.page.ListPage$1; no valid constructor
反序列化发生在IBMJSF代码中的某个地方


有什么想法吗?谢谢

您正在尝试序列化一个抽象类,根据定义,该抽象类无法实例化。 也就是说,根据ListPage的定义,您不能执行以下操作:

ListPage l=新ListPage()


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

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


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

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


异常看起来好像是试图找到派生最多的不可序列化
基类的无参数构造函数,必须对派生最少的
可序列化的
类进行访问。

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

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


尝试序列化这些对象是个坏主意,但是如果更改内部类使其成为
静态的
反序列化可能会起作用

谢谢,但这是唯一的办法吗?还有其他选择吗?一些Java序列化程序/反序列化程序确实需要一个用于处理对象的默认构造函数。您的ProjectList类是否有默认的ProjectList()构造函数?这些类都没有任何构造函数,这意味着它们将有默认构造函数,不是吗?嗯。。。对于编译器来说,答案是肯定的。然而,对象序列化程序有更高的要求。通常,他们使用反射API来检查对象,没有明确声明的构造函数可能不会出现。您总是可以添加一个简单的空构造函数,如PageList(){}您使用的是哪个序列化引擎?好的,谢谢。。。但事实证明它与内部类有关-请看我的编辑。显示实例化对象并将其传递给序列化的代码抱歉,我没有这些信息-是JSF框架尝试进行反序列化…所以你没有在某处创建ListPage的匿名内部类?实际上,我有。谢谢你的提示-请看我的编辑。但是为什么这个类的构造函数很重要呢?谢谢你的提示——请看我的编辑,“ProjectList”实际上不是抽象的。好吧,看起来很有希望,我创建了继承控制器的内部类ListPageController,但我只得到了(更明显的)“java.io.InvalidClassException:ListPage$ListPageController;没有有效的构造函数(尽管我在ListPageController中提供了默认构造函数)@Mulmoth内部(非静态)类没有默认构造函数-它们将父类的实例作为构造函数参数。将它作为一个私有类移动到同一个文件中,如果不是一个完全独立的类的话。谢谢Bozho,这很有趣,回答了我的问题。这回答了我的问题,谢谢。但是我把它给了波佐,他是第一个。@Mulmoth你不能把“package”作为包名,因为它是一个关键字。将我答案中的名称替换为“pkg”。
java.io.InvalidClassException: my.pkg.page.ListPage$1; no valid constructor