4.オブジェクトシリアライゼーション |
オブジェクトの状態を保存するための方法です。
(1) オブジェクトシリアライゼーションで状態を保存しよう |
オブジェクトシリアライゼーションでは、オブジェクトの状態を保存するのであって、クラス定義をまるごと保存するわけではないことに注意してください。
オブジェクトシリアライゼーションによってオブジェクトの状態を保存するには1つだけ条件があります。それは、 java.io.Serializable インタフェースを実装するということです。
import java.awt.*; import java.io.Serializable; public class RectangleBean extends Canvas implements Serializable { |
(2) 保存できないものもある |
シリアライズ可能 | シリアライズ不可能 |
---|---|
・ プリミティブ型(基本データ型)の値 ・ 配列 ・ 他のオブジェクトへの参照 (この場合は、そのオブジェクトのデータと クラス名のみが保存される) |
・ InputStream、OutputStream オブジェクト ・ Thread オブジェクト など |
シリアライズ不可能なものは、復元したとき、あるいは復元先で、その値が正しく復元できないようなオブジェクトです。シリアライズ不可能な変数を含んだクラスをシリアライズするには、変数の宣言時に transient というキーワードを付けておきます。
import java.awt.*; import java.io.Serializable; public class RectangleBean extends Canvas implements Serializable { private int rectSize; private Color rectColor; private transient Thread kick; |
(3) 保存のしかた |
void writeObject(Object obj) throws IOException
というメソッドです。
たとえば、オブジェクトの状態を rect.ser というファイルに保存するには次のように書きます。
public void save() { try { FileOutputStream fos = new FileOutputStream("rect.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(this); } catch (Exception e) { e.printStackTrace(); } finally { } } |
(4) 復元のしかた |
オブジェクトを復元するためのメソッドは OutjectInputStream クラスの
Object readObject() throws OptionalDataException,
ClassNotFoundException,
IOException
というメソッドです。
たとえば、オブジェクトの状態を rect.ser というファイルから復元するには次のように書きます。
public void load() { try { FileInputStream fis = new FileInputStream("rect.ser"); ObjectInputStream ois = new ObjectInputStream(fis); RectangleBean2 r = (RectangleBean2)ois.readObject(); ois.close(); fis.close(); setRectSize( r.getRectSize() ); setRectColor( r.getRectColor() ); repaint(); } catch (Exception e) { e.printStackTrace(); } } |
(5) BeanBox で試してみよう |
import java.awt.*; import java.io.*; public class RectangleBean2 extends Canvas implements Serializable { private int rectSize; private Color rectColor; public RectangleBean2() { setSize(50,50); rectSize = getWidth(); rectColor = Color.blue; } public int getRectSize() { return rectSize; } public void setRectSize(int s) { rectSize = s; } public Color getRectColor() { return rectColor; } public void setRectColor(Color c) { rectColor = c; } public void paint(Graphics g) { g.setColor(rectColor); g.fillRect(0,0,rectSize,rectSize); } public void save() { try { FileOutputStream fos = new FileOutputStream("rect.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(this); oos.close(); fos.close(); System.out.println("シリアライズしました。"); } catch (Exception e) { e.printStackTrace(); System.out.println(e); } } public void load() { try { FileInputStream fis = new FileInputStream("rect.ser"); ObjectInputStream ois = new ObjectInputStream(fis); RectangleBean2 r = (RectangleBean2)ois.readObject(); ois.close(); fis.close(); setRectSize( r.getRectSize() ); setRectColor( r.getRectColor() ); repaint(); System.out.println("復元しました。"); } catch (Exception e) { e.printStackTrace(); } } } |
MyManifest2.mf
Name:RectangleBean2.class Java-Bean:True |
C:\ja...>jar cvfm RectangleBean2.jar MyManifest2.mf RectangleBean2.class added manifest adding: RectangleBean2.class (in=2074) (out=1118) (deflated 46%) |
(4) ここで、save ボタンを押して RectangleBean2 をシリアライズします。MS-DOS プロンプトに 「シリアライズしました」と表示されるのを確認します。( rect.ser は <BDH_HOME>/beanbox にできます)
(5) Properties ウインドウの rectColor、rectSize をクリックして、四角の大きさ、色を適当に変えます。
(6) 最後に load ボタンを押すと、(4) で保存した青い四角に戻ります。