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)
© 2006 矢木浩人