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

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

目次

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

  • シリアライズとは、Javaオブジェクトからファイルなどに出力することです。
  • デシリアライズとは、ファイルなどからJavaオブジェクトに復元することです。
  • Serializableインターフェースを実装します。マーカーインターフェースのため実装が必要なメソッドはありません。
  • 項目にtransientを付けるとシリアライズ/デシリアライズの対象外になります。
  • 以下はJava8 API仕様のSerializableインターフェースのリンクです。
    https://docs.oracle.com/javase/jp/8/docs/api/java/io/Serializable.html

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

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

コード

シリアライズ/デシリアライズする対象のクラスのサンプルのコードです。
5行目は、Serializableインターフェースを実装しています。
7行目は、serialVersionUIDを定義しています。
9行目は、シリアライズ/デシリアライズ対象の項目です。
11行目は、transientがついています。シリアライズ/デシリアライズの対象外になります。

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;
    }
}

 

シリアライズするクラス

ObjectOutputStreamクラスのメソッドでシリアライズします。

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

コード

シリアライズするクラスのサンプルのコードです。
16行目は、Javaオブジェクトを生成しています。
18,19行目は、Javaオブジェクトの値を確認しています。
24行目は、writeObjectメソッドはでJavaオブジェクトからファイルに出力しています。
21,22行目は、try-with-resources構文です。リソースを自動でクローズします。

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 = "D:\\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();
        }
    }
}

 

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

ObjectInputStreamクラスのメソッドでシリアライズします。

ObjectInputStreamクラス

public final Object readObject() throws IOException,ClassNotFoundException

コード

デシリアライズするクラスのサンプルのコードです。
15行目は、Javaオブジェクトを生成しています。
18,19行目は、デシリアライズする前のJavaオブジェクトを確認しています。
25行目は、readObjectメソッドでファイルからJavaオブジェクトに出力しています。
36,37行目は、デシリアライズした後のJavaオブジェクトの値を確認しています。
項目のwidthは、transientのため値は0のままです。
21,22行目は、try-with-resources構文です。リソースを自動でクローズします。

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 = "D:\\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)){
            
            // readObjectメソッドでファイルからJavaオブジェクトに出力
            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 
    }
}

関連の記事

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

プログラムでつまったらteratailに登録して質問しましょう!↓↓↓

△上に戻る