トップ 差分 一覧 ping ソース 検索 ヘルプ PDF 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)


指定されたパートは存在しません。



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto

Copyright© 矢木 浩人 All Rights Reserved.