next up previous
Next: 5 ネイティブ言語の呼び出し Up: ソフトウェア第三 講義資料 制御文,例外,入出力,直列化,ネイティブ言語呼出,LeJOS Previous: 3.8 対話プログラムの例

4 オブジェクトの直列化

オブジェクトの表現をバイトのストリームへ変換する処理は,シリアライズ (serialization)と呼ばれ,バイトストリームからオブジェクトを再構築するこ とはディシリアライズ(deserialization)と呼ばれる. ネットワークを越えて転送したり,ファイルやデータベース へ保存したりできるバイトストリームにオブジェクトを保存して後でそのオブジェ クトを再構築することができる. シリアライズのためのストリームとして,Objectストリームがあり, ObjectInputStreamとObjectOutputStreamクラスがある. 基本データ型,文字列, 配列などの型に加えて,オブジェクトグラフの読み書きを可能とするストリーム である. オブジェクトグラフというのは,writeObjectによってObjectOutputStreamへオブジェク トを書き出す時に,オブジェクトが参照しているすべてのオブジェクトも含めて オブジェクトを表現するバイトがストリームへ書き出されるということでそれら 全体のグラフをさす. オブジェクトをバイトのストリームへ変換する処理がシリアライズとなり, シリアライズされた形式は文字ではなく,バイトで表現されるのでObjectストリー ムはReader, Writer形式は持たない. シリアライズされたオブジェクトグラフをあらわしているバイトが ObjectInputStreamのメソッドreadObjectにより読みこまれると,ディシリアラ イズされた結果は入力グラフと同じオブジェクトになる.
//: Worm.java
// Copyright (c) Bruce Eckel, 1998
// Demonstrates object serialization in Java 1.1
import java.io.*;

class Data implements Serializable {
  private int i;
  Data(int x) { i = x; }
  public String toString() {
    return Integer.toString(i);
  }
}

public class Worm implements Serializable {
  // Generate a random int value:
  private static int r() {
    return (int)(Math.random() * 10);
  }
  private Data[] d = {
    new Data(r()), new Data(r()), new Data(r())
  };
  private Worm next;
  private char c;
  // Value of i == number of segments
  Worm(int i, char x) {
    System.out.println(" Worm constructor: " + i);
    c = x;
    if(--i > 0)
      next = new Worm(i, (char)(x + 1));
  }
  Worm() {
    System.out.println("Default constructor");
  }
  public String toString() {
    String s = ":" + c + "(";
    for(int i = 0; i < d.length; i++)
      s += d[i].toString();
    s += ")";
    if(next != null)
      s += next.toString();
    return s;
  }
  public static void main(String[] args) {
    Worm w = new Worm(6, 'a');
    System.out.println("w = " + w);
    try {
      ObjectOutputStream out =
        new ObjectOutputStream(
          new FileOutputStream("worm.out"));
      out.writeObject("Worm storage");
      out.writeObject(w);
      out.close(); // Also flushes output
      ObjectInputStream in =
        new ObjectInputStream(
          new FileInputStream("worm.out"));
      String s = (String)in.readObject();
      Worm w2 = (Worm)in.readObject();
      System.out.println(s + ", w2 = " + w2);
    } catch(Exception e) {
      e.printStackTrace();
    }
    try {
      ByteArrayOutputStream bout =
        new ByteArrayOutputStream();
      ObjectOutputStream out =
        new ObjectOutputStream(bout);
      out.writeObject("Worm storage");
      out.writeObject(w);
      out.flush();
      ObjectInputStream in =
        new ObjectInputStream(
          new ByteArrayInputStream(
            bout.toByteArray()));
      String s = (String)in.readObject();
      Worm w3 = (Worm)in.readObject();
      System.out.println(s + ", w3 = " + w3);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}


generated through LaTeX2HTML. M.Inaba 平成18年5月7日