3,746 バイト追加
、 2020年2月15日 (土) 07:35
==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"}}