今回は、Java言語のシリアライズについて少しお話していきたいと思います。
Java言語に携わったことがある方は、おそらく一度は聞いたことがあるシリアライズですが、私は言葉聞いたことはあっても正直それが何であるのか理解していませんでした。
最近、Java言語にはtransientと呼ばれる修飾子があることをいまさら知りまして何なのかを調べていくと、まずはシリアライズを理解しておく必要がありました。
ですので、今回私が理解した内容を忘れないように備忘を兼ねてまとめまてみました。もし興味がある方はよろしれけばお読みいただければ幸いです。
シリアライズについて
シリアライズとは、Javaのインスタンスをバイト列として出力することを言います。バイト列とは、その名の通り複数のバイト(Byte)が並んだもののことです。バイト列という言葉を使う場合はデータの種類が何であるかは問わず、ただ単純にバイト(Byte)が並んでいるという事実を意味しているときに使うそうです。
Java言語でシリアライズ・デシリアライズをするには?
あるインスタンスをJava言語でシリアライズまたはデシリアライズするには、どうすればよいのでしょうか。実は、そんなに難しくないのです。あるクラスのインスタンスをシリアライズ・デシリアライズしたい場合は、java.io.Serializableインタフェースを実装しておけば良いのです。
java.io.Serializableはインタフェースなので、実装しなければならないメソッドがあるのかと思ってしまいますが実は何もありません。このjava.io.Serializableはマーカーインタフェースと呼ばれるインタフェースなので、実装が必要なメソッドは特にありません。
マーカーインタフェースとは?
マーカーインタフェースとは、そのインタフェースを実装しているクラスが何らかの特別な性質を持っていることを示すためだけに使われます。そのため、マーカーインタフェースにはフィールドやメソッドは何も定義されていません。
実際にマーカーインタフェースの一つであるjava.io.Serializableの定義を実際に見てみましょう。以下の通り、インタフェースの定義のみで中身は何もありません。
マーカーインタフェースの意味とは?
この何も定義がないマーカーインタフェースを実装することで何が変わるのでしょうか?
あたりまえですが、マーカーインタフェースを実装するだけでは何も機能は追加されません。ただし、マーカーインタフェースを実装しているため、その実装したクラスはマーカーインタフェースの型でも取り扱うことができるようになります。
シリアライズする処理の部分で、このマーカーインタフェースを実装した意味が効いてきます。シリアライズをするためにはjava.io.ObjectOutputStreamのwriteObjectメソッドを使います。そして、その処理の中でjava.io.Serializableを実装しているかどうかを判定しています。判定NGのときには、例外がスローされます。
このようにマーカーインタフェースを使用して、シリアライズできるクラスの色を付けているのです。
if (obj instanceof Serializable)