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

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

シリアライズとデシリアライズ

  • シリアライズを使うとJavaオブジェクトからファイルなどに出力することができます
  • デシリアライズを使うとファイルなどからJavaオブジェクトに復元することができます
  • シリアライズの対象のクラスはSerializableインターフェースを実装します
  • 特定の項目をシリアライズの対象外とする場合、項目にtransientをつけます
  • serialVersionUID(シリアルバージョンUID)は省略してもシリアライズとして動きます
  • serialVersionUID(シリアルバージョンUID)を定義しておけば、Javaのオブジェクトと出力先のserialVersionUIDのバージョンが異なっていた場合、InvalidClassExceptionの例外を発生させることができます
  • serialVersionUID(シリアルバージョンUID)はクラスの構造が変わる都度変更するのが望ましいです
  • シリアライズのときに作成されるファイルの拡張子は.serがよく使用されます

ObjectOutputStreamクラス

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

ObjectInputStreamクラス

  • デシリアライズで使用します
  • 以下はObjectInputStreamクラスのメソッドです。
    ・public final Object readObject() throws IOException,ClassNotFoundException
     →ObjectInputStreamからオブジェクトを読み込みます
  • 以下はJava8 API仕様のObjectInputStreamクラスのリンクです
    https://docs.oracle.com/javase/jp/8/docs/api/java/io/ObjectInputStream.html

コード

サンプルのコードです。
14行目からがシリアライズとデシリアライズの対象のクラスです。
98行目でファイルを指定しています。
40行目からがJavaオブジェクトからファイルへの出力の処理です。
67行目からがファイルからJavaオブジェクトへの出力の処理です。

package test1;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* シリアライズとデシリアライズの対象のクラス
*/
// Serializableインターフェースを実装
class Color implements Serializable {

	private static final long serialVersionUID = 1525287529109561926L;
	
	private String color;
	// シリアライズの対象外の項目はtransientをつける
	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;
	}
}
/**
*  Javaオブジェクトからファイル シリアライズ
*/
class Sample {
	void runSample(String outFile) {
		
		//Javaオブジェクトの生成
		Color c1 = new Color("red", 100);		
		// Javaオブジェクトの確認
		System.out.println("c1:" + c1.getColor()); //red
		System.out.println("c1:" + c1.getWidth()); //100
		
		try(FileOutputStream fo = new FileOutputStream(outFile);
			ObjectOutputStream objOut = new ObjectOutputStream(fo)){
			
			// Javaオブジェクトからファイルに出力
			objOut.writeObject(c1);
			objOut.flush();
			objOut.reset();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
/**
*  ファイルからJavaオブジェクト デシリアライズ
*/
class Sample2 {
	void runSample(String inFile) {
				
		try(FileInputStream fi = new FileInputStream(inFile);
			ObjectInputStream objIn = new ObjectInputStream(fi)){
			
			// Javaオブジェクトの生成
			Color c2 = new Color();
			
			// デシリアライズする前のJavaオブジェクトの確認
			System.out.println("c2-before:" + c2.getColor()); //null
			System.out.println("c2-before:" + c2.getWidth()); //0
			
			// readObjectメソッドでファイルからJavaオブジェクトに出力
			c2 = (Color)objIn.readObject();
						
			// Javaオブジェクトの値の確認
			// 項目のwidthは、transientのため値は0のまま
			System.out.println("c2-after:" + c2.getColor()); //red
			System.out.println("c2-after:" + c2.getWidth()); //0 

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
public class Test1 {
	public static void main(String[] args) {
		// ファイルの指定
		String sFile = "D:\\workspace123abc\\test1.ser";
		
		// Javaオブジェクトからファイルに出力
		Sample s = new Sample();
		s.runSample(sFile);
		
		// ファイルからJavaオブジェクトに出力
		Sample2 s2 = new Sample2();
		s2.runSample(sFile);
	}
}

Serializableインターフェース

以下はJava8 API仕様のSerializableインターフェースのリンクです
https://docs.oracle.com/javase/jp/8/docs/api/java/io/Serializable.html

関連の記事

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




△上に戻る