SJC-P 直列化
ナビゲーションに移動
検索に移動
目次
SJC-P 直列化
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/io/ObjectOutputStream.html
親クラスが直列化不可、子クラスが直列化可の場合
- 直列化不可の親クラスは、子クラスが直列化しても親クラスの保持する情報は保存されない。
- 子クラスのオブジェクトを復元するときには、親クラスのデフォルトコンストラクタにより、親クラスの情報が生成される。
- デフォルトコンストラクタが存在しない場合、java.io.InvalidClassException が投げられる
UnSerializeSupper.java
package sjcp.serialize;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* java.io.Serializable を実装しない親クラス
*/
public class UnSerializeSupper {
protected Integer num1;
/*
* この親クラスは、直列化不可のため、子クラスが直列化しても親クラスの保持する情報は保存されない。
* 子クラスのオブジェクトを復元するときには、親クラスのデフォルトコンストラクタにより、親クラスの情報が生成される。
* デフォルトコンストラクタが存在しない場合、java.io.InvalidClassException が投げられる
*/
public UnSerializeSupper() {
num1 = new Integer(-1);
}
public UnSerializeSupper(int num) {
num1 = new Integer(num);
}
public Integer getNumber() {
return num1;
}
public static void main(String[] args) {
SerializeDeriv deriv = new SerializeDeriv(5);
try {
File serFile = new File("c:\\work\\test.ser");
ObjectOutputStream writer
= new ObjectOutputStream(
new FileOutputStream(serFile));
System.out.printf("シリアライズ前 : %d,%d\n", deriv.getNumber(),deriv.getNumber2());
writer.writeObject(deriv);
ObjectInputStream reader
= new ObjectInputStream(
new FileInputStream(serFile));
SerializeDeriv d2 = (SerializeDeriv)reader.readObject();
System.out.printf("シリアライズ後 : %d,%d\n", d2.getNumber(),d2.getNumber2());
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* java.io.Serializable を実装した子クラス
*/
class SerializeDeriv extends UnSerializeSupper implements Serializable {
protected Integer num2;
public SerializeDeriv(int num) {
super(num);
num2 = new Integer(num * 2);
}
public Integer getNumber2() {
return num2;
}
}
実行結果
シリアライズ前 : 5,10 シリアライズ後 : -1,10
実行結果(UnSerializeSupper クラスのデフォルトコンストラクタを削除)
UnSerializeSupper クラスのデフォルトコンストラクタを削除すると、子クラスの復元において例外となる。
シリアライズ前 : 5,10 java.io.InvalidClassException: sjcp.serialize.SerializeDeriv; no valid constructor at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:428) at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:268) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1029) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:291) at sjcp.serialize.UnSerializeSupper.main(UnSerializeSupper.java:42)
{{include_html banner_html, "!Java"}}
© 2006 矢木浩人