ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

Javaのシリアライズについて

今回は、Java言語のシリアライズについて少しお話していきたいと思います。

Java言語に携わったことがある方は、おそらく一度は聞いたことがあるシリアライズですが、私は言葉聞いたことはあっても正直それが何であるのか理解していませんでした。

最近、Java言語にはtransientと呼ばれる修飾子があることをいまさら知りまして何なのかを調べていくと、まずはシリアライズを理解しておく必要がありました。

ですので、今回私が理解した内容を忘れないように備忘を兼ねてまとめまてみました。もし興味がある方はよろしれけばお読みいただければ幸いです。

シリアライズについて

シリアライズとは、Javaインスタンスをバイト列として出力することを言います。バイト列とは、その名の通り複数のバイト(Byte)が並んだもののことです。バイト列という言葉を使う場合はデータの種類が何であるかは問わず、ただ単純にバイト(Byte)が並んでいるという事実を意味しているときに使うそうです。

シリアライズについて

シリアライズの逆の処理のことをデシリアライズと呼ぶそうです。つまり、シリアライズされたバイト列を元のJavaインスタンスに復元することをデシリアライズと言います。

Java言語でシリアライズ・デシリアライズをするには?

あるインスタンスJava言語でシリアライズまたはデシリアライズするには、どうすればよいのでしょうか。実は、そんなに難しくないのです。あるクラスのインスタンスシリアライズ・デシリアライズしたい場合は、java.io.Serializableインタフェースを実装しておけば良いのです。

java.io.Serializableはインタフェースなので、実装しなければならないメソッドがあるのかと思ってしまいますが実は何もありません。このjava.io.Serializableはマーカーインタフェースと呼ばれるインタフェースなので、実装が必要なメソッドは特にありません。

マーカーインタフェースとは?

マーカーインタフェースとは、そのインタフェースを実装しているクラスが何らかの特別な性質を持っていることを示すためだけに使われます。そのため、マーカーインタフェースにはフィールドやメソッドは何も定義されていません。

実際にマーカーインタフェースの一つであるjava.io.Serializableの定義を実際に見てみましょう。以下の通り、インタフェースの定義のみで中身は何もありません。

Serializableインタフェースキャプチャ

マーカーインタフェースの意味とは?

この何も定義がないマーカーインタフェースを実装することで何が変わるのでしょうか?
あたりまえですが、マーカーインタフェースを実装するだけでは何も機能は追加されません。ただし、マーカーインタフェースを実装しているため、その実装したクラスはマーカーインタフェースの型でも取り扱うことができるようになります。

シリアライズする処理の部分で、このマーカーインタフェースを実装した意味が効いてきます。シリアライズをするためにはjava.io.ObjectOutputStreamのwriteObjectメソッドを使います。そして、その処理の中でjava.io.Serializableを実装しているかどうかを判定しています。判定NGのときには、例外がスローされます。
このようにマーカーインタフェースを使用して、シリアライズできるクラスの色を付けているのです。

if (obj instanceof Serializable)

おわりに

いかがでしたでしょうか。Java言語のシリアライズについて簡単にまとめてみました。今まで触れてこなかった人は、たいした話ではないかもしれませんが知っておくといつか役にたつかもしれません。近いうちにtransient修飾子も確認していきたいと思います。
今回も最後までお読みいただきありがとうございました。この辺で失礼いたします。