如何反序列化具有参数化构造函数的对象

时间:2012-12-05 06:35:11

标签: java serialization constructor parameterized

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

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

如何清除此问题..提前使用...

1 个答案:

答案 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中有一个不安全的方法,用于在不调用构造函数的情况下分配对象。真实的故事。