ひよっこPGのブログ

主に、技術メモや英語たまにギター関連のことも書いているブログです。

Serializable(シリアライズ)について

Javaでシリアライズ、デシリアライズするサンプル - 感謝のプログラミング 10000時間
sho322さんの上記記事を読みました。
読んだ後にコメントを書いたのですが、implements Runnableのことを Serializableと思い違いしてて・・・。
スレッド処理は複数の処理が同時に動くイメージから、一時的に情報を保持するためにSerializable(正しくはRunnable)を実装するのかなと自分で納得してしまった感じです。

上記のことから、勉強不足だなと思ったのでSerializableについて調べてみました。

Serializable(シリアライズ)って?

オブジェクトの状態を ファイルに保存すること。
シリアライズされて出来たファイルを もとのデータに戻すことを デシリアライズといいます。

DBにデータを保存させたくない、ネットワークを介してデータを渡したい。
そんな時に使われるみたいです。

自分なりに作ってみたサンプル

package test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Test {
	public static void main(String args[]){
        // テストデータ作成
		User user = new User();
		user.setName("Buzz");
		user.setGender("男");
		
		// シリアライズ
		try {
			FileOutputStream outFile = new FileOutputStream("user.txt");
			ObjectOutputStream out = new ObjectOutputStream(outFile);
			out.writeObject(user);
			out.close();
			outFile.close();
		} catch(Exception ex) {
			ex.printStackTrace();
		}
		
		// デシリアライズ
		User readedUser = null;
		try {
			FileInputStream inFile = new FileInputStream("user.txt");
			ObjectInputStream in = new ObjectInputStream(inFile);
			readedUser = (User)in.readObject();
			in.close();
			inFile.close();
		} catch(Exception ex) {
			ex.printStackTrace();
		}
		
		// デシリアライズしたデータの確認
		System.out.println(readedUser.getName());
		System.out.println(readedUser.getGender());
	}
}

class User implements Serializable{
	private String name;
	private String gender;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
}

実行結果

Buzz
男


サンプルは上記のような感じです。
処理の順番を軽く説明すると、
1. シリアライズする。
ユーザの情報をUserクラスとして扱って、そのUserクラスの状態を user.txtに保存(シリアライズ)します。
user.txtの内容はこんな感じです。

aced 0005 7372 0009 7465 7374 2e55 7365
7263 a777 0f67 fbb0 d102 0002 4c00 0667
656e 6465 7274 0012 4c6a 6176 612f 6c61
6e67 2f53 7472 696e 673b 4c00 046e 616d
6571 007e 0001 7870 7400 03e7 94b7 7400
0442 757a 7a

2. デシリアライズする
シリアライズして、出力したuser.txtファイルから 情報を取得します。

3. デシリアライズ結果を確認する。
System.out.println()で、コンソール上にデシリアライズした結果を出力します。

implements Serializableについて

いくつかのサイトを見てみると
Serializableを実装するということは、

自分はこのクラスをシリアライズ可能であることを保証します! 

ということになるみたいです。

Runnable(スレッド処理を可能にする)やComparable(ソートを可能にする)のように実装すれば
〜出来るようになる と違って Serializableは自分の実装がシリアライズ可能であることを保証することみたいです。
なので、シリアライズが困難なクラスも Serializableを実装できるということです。注意しないといけないですね。。。


参考
難解なSerializableという仕様について俺が知っていること、というか俺の理解 - 都元ダイスケ IT-PRESS
Java直列化メモ(Hishidama's Java Serializable Memo)