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; 有効なコンストラクターがありません

この問題をクリアする方法..事前に感謝...

4

1 に答える 1

2

クラスも同様にItem実装する必要があります。Serializable

class Item implements Serializable {

    // ...

}

そしてそれは動作します!

ただし、Item手の届かないところにあり、引数のないコンストラクターがない場合は、Bookシリアル化できません。シリアライズ不可能なクラスのサブクラスをシリアライズ可能にする唯一の方法は、「最初のシリアライズ不可能なスーパークラスのサブクラスからアクセス可能な引数なしのコンストラクター」ObjectStreamClassが見つかった場合です(のgetSerializableConstructorメソッドのソースコードから引用)。あなたの場合、どれが欠けているように見えるので、Bookシリアライズ可能にすることはできません。

いずれにしても、オブジェクトがプリミティブのみで構成されている場合、オブジェクトをシリアル化する別の方法として JSON を調べることができます。http://www.json.orgに Java 用の JSON ライブラリのリストがあります。

 

NB、 Java がコンストラクターを呼び出さずにシリアル化可能なクラスのオブジェクトを作成できるのはどうしてですか? Java の API の奥深くに、コンストラクターを呼び出さずにオブジェクトを割り当てるために使用される安全でないメソッドがあります。実話。

于 2012-12-05T06:59:13.363 に答える