Java シリアライズとデシリアライズのサンプル

Javaのシリアライズとデシリアライズのサンプルです。

確認環境
・Java 8

目次

シリアライズ/デシリアライズする対象のクラス

  • シリアライズとは、Javaオブジェクトからバイト列に変換しファイルなどに出力することです。
  • デシリアライズとは、シリアライズ化されたファイルなどからJavaオブジェクトに復元することです。
  • Serializableインターフェースを実装します。マーカーインターフェース(中身が空)のため実装が必要なメソッドはありません。
  • 項目にtransientを付けるとシリアライズ/デシリアライズの対象外になります。
  • 以下はJava8 API仕様のSerializableインターフェースのリンクです。
    https://docs.oracle.com/javase/jp/8/docs/api/java/io/Serializable.html
  • 以下は、Wikipediaのシリアライズのリンクです。
    https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA

serialVersionUID(シリアルバージョンUID)

  • クラスの構造のバージョンを表します。変更があった場合、数値を変更します。
  • 省略しても動きます。
  • シリアライズした時のバージョンとデシリアライズする時のバージョンが異なっていた場合、デシリアライズできません。InvalidClassException例外が発生します。
  • シリアライズのときに作成されるファイルの拡張子は.serがよく使用されます。
  • EclipseにはシリアルバージョンUIDを自動で生成する方法があります。
    Eclipse JavaのシリアルバージョンUIDを自動で生成する方法

サンプルコードの環境

サンプルコードとして3つのクラスがあります。(Color.java,Test1.java,Test2.java)
流れとして、以下の2つを行います。

1.Javaオブジェクトからシリアライズしてserファイルに値をセットする。

2.serファイルからデシリアライズしてJavaオブジェクトに値をセットする。

1.シリアライズ/デシリアライズする対象のクラス

シリアライズ/デシリアライズする対象のクラスのサンプルのコードです。

package test1;
import java.io.Serializable;

public class Color implements Serializable {

    private static final long serialVersionUID = 1525287529109561926L;
    
    private String color;

    private transient int width;

    Color() {
    }
    Color(String color, int width) {
        this.color = color;
        this.width = width;
    }
    public String getColor() {
        return color;
    }
    public int getWidth() {
        return width;
    }
}

4行目は、Serializableインターフェースを実装しています。
6行目は、serialVersionUIDを定義しています。
8行目は、シリアライズ/デシリアライズ対象の項目です。
10行目は、transientがついています。シリアライズ/デシリアライズの対象外になります。

 

2.シリアライズするクラス

シリアライズするクラスのサンプルのコードです。

package test1;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Test1 {
    public static void main(String[] args) {

        String outFile = "E:\\workspace123abc\\test1.ser";
        
        Color c1 = new Color("red", 100);       
        System.out.println(c1.getColor()); //red
        System.out.println(c1.getWidth()); //100
        
        try(FileOutputStream fo = new FileOutputStream(outFile);
            ObjectOutputStream objOut = new ObjectOutputStream(fo)){
            objOut.writeObject(c1);
            objOut.flush();
            objOut.reset();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

12行目は、Javaオブジェクトを生成しています。
13,14行目は、Javaオブジェクトの値を確認しています。
18行目は、writeObjectメソッドはでJavaオブジェクトからファイルに出力しています。
16,17行目は、try-with-resources構文です。リソースを自動でクローズします。

serファイルの中身

出力されるserファイルの中身はバイナリになっています。

 

3.デシリアライズするクラス

デシリアライズするクラスのサンプルのコードです。

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

public class Test2 {
    public static void main(String[] args) {

        String inFile = "E:\\workspace123abc\\test1.ser";
        
        Color c2 = new Color();
        // デシリアライズする前のJavaオブジェクトの確認
        System.out.println("before:" + c2.getColor()); //null
        System.out.println("before:" + c2.getWidth()); //0

        try(FileInputStream fi = new FileInputStream(inFile);
            ObjectInputStream objIn = new ObjectInputStream(fi)){
            c2 = (Color)objIn.readObject();
                        
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }catch (Exception e) {
            e.printStackTrace();
        }
        // Javaオブジェクトの値の確認
        System.out.println("after:" + c2.getColor()); //red
        System.out.println("after:" + c2.getWidth()); //0 
    }
}

11行目は、Javaオブジェクトを生成しています。
13,14行目は、デシリアライズする前のJavaオブジェクトを確認しています。
18行目は、readObjectメソッドでファイルからJavaオブジェクトに出力しています。
28,29行目は、デシリアライズした後のJavaオブジェクトの値を確認しています。
項目のwidthは、transientのため値は0のままです。
16,17行目は、try-with-resources構文です。リソースを自動でクローズします。

ObjectOutputStreamクラス

public final void writeObject(Object obj) throws IOException
public void flush() throws IOException
public void reset() throws IOException
  • シリアライズで使用します。
  • writeObjectメソッドは、オブジェクトをObjectOutputStreamに書き込みます。
  • flushメソッドは、ストリームをフラッシュします。
  • resetメソッドは、新しいObjectOutputStreamと同じ状態にリセットします。
  • 以下はJava8 API仕様のObjectOutputStreamクラスのリンクです
    https://docs.oracle.com/javase/jp/8/docs/api/java/io/ObjectOutputStream.html

ObjectInputStreamクラス

public final Object readObject() throws IOException,ClassNotFoundException

関連の記事

Eclipse JavaのシリアルバージョンUIDを自動で生成する方法

△上に戻る