Bits of Java (トップ)

目次  前へ  次へ

直列化されたオブジェクトの復元

前項で直列化してファイルに出力した data というファイルから Book オブジェクトを復元して標準出力に toString メソッドの戻り値を表示するプログラムです。 例外を一つずつ catch しているので長くなっていますがオブジェクトへの復元は ObjectInputStream オブジェクトを作成したら下の1行のみです。

Book book = (Book)in.readObject();
標準出力には
Book title:きまぐれロボット  author:星新一
と表示されます。

/******************** DeserializationSample.java ********************/
import java.io.*;

public class DeserializationSample {

    public static void main(String[] args) {
        ObjectInputStream in = null;
        try {
            in = new ObjectInputStream(new BufferedInputStream(
                                       new FileInputStream("data")));
            //このメソッドでファイル(とロードされているクラス)から復元
            Book book = (Book)in.readObject();
            System.out.println(book);

        } catch (InvalidClassException e) {
            //(java.io.ObjectStreamExceptionのサブクラス)
            //クラスの直列化バージョンが、ストリームから読み込まれた
            //クラス記述子の直列化バージョンと一致しない場合
            //クラスに未知のデータ型が含まれている場合
            //クラスに、アクセス可能な引数なしのコンストラクタがない場合
            System.out.println( "復元に失敗 - " + e);

        } catch (StreamCorruptedException e) {
            //(java.io.ObjectStreamExceptionのサブクラス)
            //オブジェクトストリームから読み込まれた制御情報が、
            //内部整合性検査に違反していた場合にスローされます。
            System.out.println( "復元に失敗 - " + e);

        } catch (OptionalDataException e) {
            //(java.io.ObjectStreamExceptionのサブクラス)
            //プリミティブデータが読み込まれていないか、
            //またはデータの終わりがストリーム内の直列化オブジェクトに
            //あるため、オブジェクトの読み込み操作が失敗したことを示す例外
            System.out.println( "復元に失敗 - " + e);

        } catch (IOException e) {
            //入出力に関連した例外
            System.out.println( "復元に失敗 - " + e);

        } catch (ClassNotFoundException e) {
            //直列化されたオブジェクトのクラスが見つからなかった場合
            System.out.println( "復元に失敗 - " + e);

        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {}
            }
        }
    }
}


/**************************** Book.java ****************************/
public class Book implements java.io.Serializable {
    protected String title;
    protected String author;

    public Book() {}

    public Book(String title, String author) {
        this.title  = title;
        this.author = author;
    }
//--------------------------------------------------------------------
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
//--------------------------------------------------------------------
    public String toString() {
        return "Book title:" + title + "  author:" + author;
    }
}