前項に続きExternalizable インターフェイスの実装例です。
Book クラスは Serializable インターフェイスを実装しておりそのサブクラスの
SubBook クラスで Externalizable インターフェイスを実装しています。
SubSubBook クラスは SubBook クラスのサブクラスです。
BookSerializeSample では SubSubBook クラスのインスタンスを直列化、復元しています。
SubSubBook クラスでスーパークラスの SubBook で実装している writeExternal メソッドをオーバーライドしています。 もし SubSubBook クラスで writeExternal をオーバーライドしていない場合には SubBook クラスで実装されている writeExternal メソッドが実行されますがこの場合には SubSubBook クラスのフィールド size の文字列が失われてしまします。 また SubSubBook クラスの writeExternal メソッドでは最初に スーパークラスの writeExternal を呼び出していますがこれがない場合には直列化されるのは size のみでスーパークラスのフィールドの値はすべて失われてしまいます。
BookSerializeSample の実行結果は以下です。
SubSubBook title:きまぐれロボット author:星新一 price:357 size:A6
/**************************** 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;
}
}
/************************* SubSubBook.java *************************/
import java.io.*;
public class SubSubBook extends SubBook {
protected String size;
public SubSubBook() {}
public SubSubBook(String title, String author,
int price, String size) {
super(title, author, price);
this.size = size;
}
//--------------------------------------------------------------------
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
//--------------------------------------------------------------------
public void writeExternal(ObjectOutput out) throws IOException {
super.writeExternal(out);
out.writeObject(size);
}
//--------------------------------------------------------------------
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
super.readExternal(in);
size = (String)in.readObject();
}
//--------------------------------------------------------------------
public String toString() {
return "SubSubBook title:" + title + " author:" + author +
" price:" + price + " size:" + size;
}
}
/********************* BookSerializeSample.java *********************/
import java.io.*;
public class BookSerializeSample {
public static void main(String[] args) throws Exception {
SubSubBook book = new SubSubBook("きまぐれロボット", "星新一",
357, "A6");
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) {}
}
}
}
}