Javaに関する様々な情報をご紹介します。

7オブジェクトのシリアライズ

Javaに関する様々な情報をご紹介します。

オブジェクトのシリアライズ

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

実行結果2

D:\JAVA>javac ExIO6.java

D:\JAVA>java ExIO6
Hello World!!

D:\JAVA>

7オブジェクトのシリアライズ