シリアライズ(Serialize)

シリアライズとは

シリアライズは直列化とも呼び、オブジェクト(クラスのインスタンス)をそのまま入出力するための仕組みのことです。

オブジェクトを出力ストリームに書き出すことをシリアライズ
入力ストリームからオブジェクトを読み込むことをデシリアライズと呼びます。

シリアライズの図

シリアライズルール

シリアライズには以下のようなルールがあります。

  • シリアライズ可能とするには java.io.Serializableインターフェースの実装が必要。
  • インスタンス変数(メンバ変数)がシリアライズ対象となる。
  • ただし、static変数はシリアライズの対象外。
  • 明示的にシリアライズ対象外としたい変数には、transient修飾子を指定する。
  • 配列をシリアライズしたい場合は、要素のオブジェクトがシリアライズ可能クラスである必要がある。
  • シリアライズ可能なクラスを継承したクラスのインスタンス変数はシリアライズ可能。

シリアライズ可能クラスを定義するサンプル

シリアライズ可能なクラスをコーディングする例です。

(ItemClass.java)

import java.io.Serializable;

public class ItemClass implements Serializable {
  
  private int itemCd;          //商品コード
  private String itemName;     //商品名
  private transient int price; //価格 ※シリアライズしない

  public ItemClass(int itemCd, String itemName, int price) {
    this.itemCd = itemCd;
    this.itemName = itemName;
    this.price = price;
  }
  public int getItemCd() {
    return itemCd;
  }
  public String getItemName() {
    return itemName;
  }
  public int getPrice() {
    return price;
  }
}

ItemClassクラスは、java.io.Serializableインターフェースを実装しているためシリアライズ可能です。 メンバー変数にはitemCd、itemName、priceの3つが定義されていますが、priceはtransient修飾子が指定されているためシリアライズの対象外です。

シリアライズ可能クラスを入出力するサンプル

出力(シリアライズ)する

上記ItemClassオブジェクトをシリアライズしてtest.serファイルに出力する例です。

(ItemClassをファイルにシリアライズする)

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Hashtable;

//シリアライズしてファイルに書き出す
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.ser"))) {
  ItemClass item = new ItemClass(123, "りんご", 150);
  oos.writeObject(item);
} catch (IOException e) {
    e.printStackTrace();
}

実行すると、ItemClassの情報が記録されたtest.serというファイルが生成されます。

入力(デシリアライズ)する

上記で出力されたファイルtest.serを読み込みデシリアライズする例です。

(ファイルからItemClassオブジェクトにデシリアライズする)

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

//ファイルを読み込みデシリアライズする
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.ser"))){
  ItemClass item = (ItemClass) ois.readObject();
  System.out.println("商品コード:" + item.getItemCd());
  System.out.println("商品名:" + item.getItemName());
  System.out.println("価格:" + item.getPrice());

}catch(IOException | ClassNotFoundException e){
  e.printStackTrace();
}
(実行結果)
商品コード:123 商品名:りんご 価格:0

test.serファイルからItemClassにデシリアライズして内容を表示しています。
priceはtransientでデシリアライズ対象外に指定しているため値はデフォルト値になっています。

コメント

タイトルとURLをコピーしました