みなさんこんにちは、 masa です。今日は、Java の基本部分なのですが個人的にあまり使う機会のなかった Serializable インターフェースについて取り上げてみたいと思います。
まずシリアライズという言葉ですが、直訳すると直列化といいます。でもそんな覚え方しなくていいです。逆に理解しづらくなります。Java でいうシリアライズは簡単にいうと
オブジェクトの情報をファイルに保存すること
余談ですが、インフラの世界ではハードウェアにデータを流し込む際に複数のデータを一列に整列させて、ひとつづつ順番に処理することを指したりします。この場合はまだ直列化でも理解しやすいかもしれませんけどね。
通常、オブジェクトが持っているデータというのはメモリ上に展開されていますので、そのオブジェクトが使われなくなると java のガベコレが開放してくれてオブジェクトは消えます。しかし、それだとオブジェクトデータの永続化ができません。そこで、別サーバーでオブジェクトを引き継いで使いたい場合などに使うのがシリアライズです。
超簡単なサンプルでオブジェクトをファイルに保存してみる
以下はスイーツの名前情報を持っているオブジェクトを sweets.bin というバイナリファイルに保存しています。
(Sweets.java) データ格納クラス
package jp.cloudear.spring_boot; import java.io.Serializable; public class Sweets implements Serializable { String name; public Sweets(String name){ this.name = name; } public String getName(){ return name; } }
(SeriTest.java) シリアライズする
package jp.cloudear.spring_boot; import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.io.FileNotFoundException; import java.io.IOException; /** * * @author masa */ public class SeriTest { public static void main(String[] args) { try { ObjectOutputStream objOutStream = new ObjectOutputStream( new FileOutputStream("C:\\sweets.bin")); Sweets sweets = new Sweets("ChocoBanana!"); objOutStream.writeObject(sweets); objOutStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
実行してみると、
バイナリ形式でオブジェクトと中のデータが保存されました。次はこのバイナリファイルからデータを取り出すデシリアライズをやってみます。
保存したファイルからオブジェクトを復元する
(DeSeriTest.java) デシリアライズクラス
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.ObjectInputStream; /** * * @author masa */ public class DeSeriTest { public static void main(String[] args) { try { ObjectInputStream objInStream = new ObjectInputStream( new FileInputStream("C:\\sweets.bin")); Sweets sweets = (Sweets) objInStream.readObject(); objInStream.close(); System.out.println(sweets.getName()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
無事復元できました。
ちなみに、シリアライズするときに、シリアライズから除外したいデータがある場合は、対象のフィールドに transient を付けることで可能です。この場合は当然復元してもデータは表示されません。
いかがでしたか?メモリ上のオブジェクトをファイルに保存して永続化する Serializable インターフェースとファイルI/Oのクラスを扱いました。どうも自分が調べていてあまりわかりやすいページが見つけられなかったため、超簡単サンプルとして書いています。みなさんの理解の一助にしていただければ幸いです。