Bits of Java (トップ)

目次  前へ  次へ

Externalizable の実装例 その1

下のプログラムは Externalizable インターフェイスの実装例です。
Book クラスは Serializable インターフェイスを実装しておりそのサブクラスの SubBook クラスで Externalizable インターフェイスを実装しています。
BookSerializeSample では SubBook クラスのインスタンスを直列化、復元しています。
Externalizable オブジェクトを直列化する場合には直列化するクラスからスーパークラスへ writeExternal メソッドを探し最初に見つかった writeExternal を実行します。 SubBook オブジェクトの場合は writeExternal を実装しているのでこのメソッドが実行されます。 Book は Serializable を実装していますがこれは全く関係ありません。 Externalizable オブジェクトを直列化する場合にはスーパークラスに Serializable を実装しているクラスがあってもなくても直列化、復元の際の処理に影響しません。 SubBook オブジェクトの直列化の場合はスーパークラス Book のフィールド title author の直列化も SubBook#writeExternal メソッドに実装される必要があります。 readExternal メソッドに関しても同様に writeExternal で書き出した title author の 値の復元の必要があります。

BookSerializeSample の実行結果は以下です。

SubBook title:きまぐれロボット  author:星新一  price:357

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

    protected 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;
    }
}

/**************************** SubBook.java ****************************/
import java.io.*;

public class SubBook extends Book implements Externalizable {
    protected int price;

    public SubBook() {}

    public SubBook(String title, String author, int price) {
        super(title, author);
        this.price = price;
    }
//--------------------------------------------------------------------
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
//--------------------------------------------------------------------
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(title);
        out.writeObject(author);
        out.writeInt(price);
    }
//--------------------------------------------------------------------
    public void readExternal(ObjectInput in) throws IOException,
                                                    ClassNotFoundException {
        title  = (String)in.readObject();
        author = (String)in.readObject();
        price  = in.readInt();
    }

//--------------------------------------------------------------------
    public String toString() {
        return "SubBook title:" + title + "  author:" + author +
               "  price:" + price;
    }
}

/********************* BookSerializeSample.java *********************/
import java.io.*;

public class BookSerializeSample {
    public static void main(String[] args) throws Exception {
        SubBook book = new SubBook("きまぐれロボット", "星新一", 357);
        ObjectOutputStream out = null;
        ObjectInputStream in = null;
        try {
            out = new ObjectOutputStream(
                      new BufferedOutputStream(
                          new FileOutputStream("bookdata")));
            out.writeObject(book);
            out.close();
            out = null;

            in = new ObjectInputStream(
                     new BufferedInputStream(
                         new FileInputStream("bookdata")));
            System.out.println(in.readObject());

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