4

您好我正在尝试反序列化以下对象。

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; 没有有效的构造函数

如何解决这个问题..thanx提前...

4

1 回答 1

2

该类也Item必须实现Serializable

class Item implements Serializable {

    // ...

}

它有效!

但是,如果Item超出您的能力范围并且没有非参数构造函数,则无法使其Book可序列化。使不可序列化类的子类可序列化的唯一方法是找到“第一个不可序列化超类的子类可访问的无参数构造函数”(引用ObjectStreamClass'sgetSerializableConstructor方法的源代码)。在您的情况下,这似乎丢失了,因此Book无法序列化。

在这种情况下,鉴于您的对象仅由原语组成,您可以将 JSON 作为序列化对象的替代方式。在http://www.json.org上有一个用于 Java 的 JSON 库列表

 

注意, Java 怎么可能在不调用构造函数的情况下创建可序列化类的对象?在 Java API 的深处有一个不安全的方法,用于分配对象而不调用它们的构造函数。真实的故事。

于 2012-12-05T06:59:13.363 回答