Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Java基本 > 入出力 −7.オブジェクトのシリアライズ
更新日:2006/1/2
入出力−7.オブジェクトのシリアライズ

このページではJavaでの入出力処理のうちオブジェクトのシリアライズについて説明をします。オブジェクトのシリアライズでは以下のクラスを使用します。

【バイトストリーム】
ObjectInputStreamクラス
ObjectOutputStreamクラス

概要
Javaでは文字データやバイトデータの入出力以外に、オブジェクトの入出力を行うクラスが用意されています。オブジェクトの入出力はオブジェクトを再利用するため一時的にオブジェクトを保持する場合や、リモート環境にあるプログラムとソケットを利用してオブジェクトをやり取りを行う場合などに使用します。

オブジェクトの入手力処理はオブジェクトのシリアライズ(直列化)と呼ばれています。それはオブジェクトの書き込み処理を行う場合、読み込み処理に備えオブジェクトを一連のつながりのあるデータとして書き込む必要があるためです。読み込む際は書き込まれた一連のデータの順に読み込み処理を行います。

オブジェクトのシリアライズを行う際、そのオブジェクトのクラスはSerializableインタフェースを実装する必要があります。Serializableインタフェース自体には何の定義もされていません。そのため、Serializableインタフェースを実装したクラスでは、何のメソッドも再定義する必要はありません。Serializableインタフェースは単に実装したクラスがオブジェクトのシリアライズが可能であることを示すものです。

transient修飾子、static修飾子が付与されている変数、メソッドはシリアライズされません。そのため、シリアライズを行いたくない変数、メソッドに対してはtransient修飾子、static修飾子を付与します。
コンストラクタ
オブジェクトのシリアライズで使用されるクラスの主なコンストラクタを紹介します。
ObjectInputStreamクラス
コンストラクタ
説明
ObjectInputStream(InputStream)
引数に指定されたInputStreamオブジェクトからオブジェクトの読み込みを行う、ObjectInputStreamオブジェクトを生成します。
ObjectOutputStreamクラス
コンストラクタ
説明
ObjectOutputStream(OutputStream)
引数に指定されたOutputStreamオブジェクトからオブジェクトの書き込みを行う、ObjectOutputStreamオブジェクトを生成します。

【例1】

//オブジェクトの読み込みを行う
//FileInputStreamオブジェクトinFileを生成します。
//inFileを引数にObjectInputStreamオブジェクトinObjectを生成します。
FileInputStream inFile = new FileInputStream("object.txt"); 
ObjectInputStream inObject = new ObjectInputStream(inFile);

//オブジェクトの書き込みを行う
//FileOutputStreamオブジェクトoutFileを生成します。
//outFileを引数にObjectOutputStreamオブジェクトoutObjectを生成します。
FileOutputStream outFile = new FileOutputStream("object.txt"); 
ObjectOutputStream outObject = new ObjectOutputStream(outFile);
使用例

オブジェクトのシリアライズの例を記載します 。

【例2】クラスHelloのオブジェクトをObjectOutputStreamクラスを使用し、ファイル(object.txt)に書き込みます。書き込んだオブジェクトをObjectInputStreamクラスを使用し、読み込むプログラムです

【Hello.javaファイル】

import java.io.*;

//(1)クラスHelloの宣言
public class Hello implements Serializable {
  void sayHello() {
    System.out.println("Hello World!!");
  }
}

【ExIO6.javaファイル】

import java.io.*;

public class ExIO6 {
  public static void main(String[] args) {
    try {
      //(2)FileOutputStreamオブジェクトの生成
      FileOutputStream outFile = new FileOutputStream("object.txt");
      //(3)ObjectOutputStreamオブジェクトの生成
      ObjectOutputStream outObject = new ObjectOutputStream(outFile);
      //(4)クラスHelloのオブジェクトの書き込み
      outObject.writeObject(new Hello());

      outObject.close();  //(5)オブジェクト出力ストリームのクローズ
      outFile.close();  //(6)ファイル出力ストリームのクローズ

      //(7)FileInputStreamオブジェクトの生成
      FileInputStream inFile = new FileInputStream("object.txt");
      //(8)ObjectInputStreamオブジェクトの生成
      ObjectInputStream inObject = new ObjectInputStream(inFile);
      //(9)オブジェクトの読み込み
      Hello exHello = (Hello)inObject.readObject();

      //(10)オブジェクトの実行
      exHello.sayHello();

      inObject.close();  //(11)オブジェクト入力ストリームのクローズ
      inFile.close();  //(12)ファイル入力ストリームのクローズ
    } catch (IOException e) {
    } catch (ClassNotFoundException e) {
    }
  }
}

【解説2】

(1). オブジェクトのシリアライズを行うクラスHelloを宣言します。クラス内では「Hello World!!」を出力するメソッドsyaHelloを宣言しています。
(2). オブジェクトの出力を書き込むため、ファイルobject.txtを引数にFileOutputStreamオブジェクトを生成します。
(3). FileOutputStreamクラスのオブジェクトoutFileを引数にObjectOutputStreamオブジェクトを生成します。
(4). writeObjectメソッドを使用し、オブジェクトの書き込み処理を行います。メソッドの引数には書き込みたいオブジェクトを指定します。
(5). オブジェクト出力ストリームをクローズします。入出力クラスのラップを行った場合、外側のクラスから順にストリームをクローズします。
(6). ファイル出力ストリームをクローズします。
(7). オブジェクトの入力処理を行うファイルobject.txtを引数にFileInputStreamオブジェクトを生成します。
(8). FileInputStreamクラスのオブジェクトinFileを引数にObjectInputStreamオブジェクトを生成します。
(9). readObjectメソッドを使用しオブジェクトの読み込み処理を行います。readObjectメソッドは返り値としてObject型を返します。そのため、代入したい変数の型へキャスト処理を行います。
(10). 読み込まれたオブジェクトexHelloを使用し、sayHelloメソッドを実行します。
(11). オブジェクト入力ストリームをクローズします。
(12). ファイル入力ストリームをクローズします。

【実行結果2】

D:\JAVA>javac ExIO6.java

D:\JAVA>java ExIO6
Hello World!!

D:\JAVA>



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道