!!!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.(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"}}