トップ 一覧 ping 検索 ヘルプ RSS ログイン

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"}}