初めてtransient
というフィールド修飾子に遭遇したのでメモ。
private transient long originalTime;
一般的な説明
transientを付与すると該当のフィールドは直列化の対象外となる。
該当の変数を持つクラスを直列化しようとして、NotSerilizabaleException
が発生した際にこの修飾子を付与するととりあえず例外は発生しなくなる。
直列化ってなに?
直列化以外にも、シリアライズ、シリアル化などと呼ばれる。
オブジェクトと直列化することはオブジェクトの情報をストリーム化し、ファイルとして保存 or ネットワークを介してやり取りする
ことが可能になるっぽい。要するにJavaのオブジェクトをバイト列として出力するということ。
どういう時に直列化できないの?
そもそもオブジェクトによっては直列化できる・できないが決まっている。そのようなオブジェクトを持っているクラス自体を直列化しようとすると前述の例外が発生すると思われる。
直列化する方法
あるクラスを直列化するにはjava.io.Serializable
を実装すればいい。 シリアライズ化可能ですよー、という証でこのinterfaceを実装すると良い。
個人的なまとめ
- Javaオブジェクトをファイルに保存したり、ネットワーク経由で伝達する場合は直列化(シリアライズ)が必要。
- 特定のクラスを直列化するには
Serializable
を実装する必要がある。 - クラスを直列化した時に
NotSerilizabaleException
が発生することがある。 - 直列化の対象外にするために
transient
を使う。