您好我正在尝试反序列化以下对象。
public class Book extends Item implements Serializable {
public Boolean isBook;
public Boolean isBookch;
private String publicationPlace;
private String publisher;
private int edition;
private String pages;
private String article;
Book(String title, String author, String year)
{
super(title, author, year);
isBook = false;
isBookch = false;
publicationPlace = " !!! Not Known !!! ";
publisher = " !!! Not Known !!! ";
edition = 1;
pages = "!!! Not Known !!!";
article = " !!! Not Known !!! ";
}
这是对象的结构,我正在将其作为......进行安慰。
openw("books.dat");
Date date = new Date ();
out.writeObject(date);
for(Book b : books )
out.writeObject ( b );
closew();
这对于任何错误都可以正常工作。 我试着把它分散为......
openr("books.dat");
Date lastsaved = (Date)in.readObject();
System.out.println("last saved date : " + lastsaved.toString());
while( true )
{
Object o = in.readObject();
if(o == null )
break;
else
{
addItem((Book)o);
books.add((Book)o);
}
}
closer();
这就是错误:java.io.InvalidClassException:Book;没有有效的构造函数
如何清除此问题..提前使用...
答案 0 :(得分:2)
班级Item
也必须实施Serializable
,
class Item implements Serializable {
// ...
}
它有效!
但是,如果Item
超出您的范围并且没有非参数构造函数,则无法使Book
可序列化。使非可序列化类的子类可序列化的唯一方法是找到“第一个非可序列化超类”的子类可访问no-arg构造函数(引自{{的源代码) 1}} ObjectStreamClass
方法)。在您的情况下似乎缺少哪些,因此getSerializableConstructor
无法进行序列化。
在这种情况下,如果您的对象只包含基元,您可以将JSON作为序列化对象的替代方法。在http://www.json.org
上有一个Java的JSON库列表
NB,如何在不调用构造函数的情况下创建可序列化类的对象?在Java的API中有一个不安全的方法,用于在不调用构造函数的情况下分配对象。真实的故事。