下のプログラムは 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) {}
}
}
}
}