serialVersionUIDというかオブジェクト直列化
職場で「serialVersionUIDって、設定したほうがいいのかな?」と聞かれた。
Eclipseをつかっていると、黄色の警告で表示されるあれ。java.io.Serializableをimplementsしていたり、implementsしているクラスを継承したりしていると、警告として出るようだ。警告がでないようにするのは、ソースコードのクラス名を選択した状態で、Ctrl + 1とすれば生成してくれるのだけど。
こいつも調べておこう。
Javaのどういった機能?と関係あるのかといえば、
Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle
になる。
Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle
ここの、これ。
Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle
4.6 ストリーム固有識別子
クラスに対してこの SUID を宣言しないと、この値はそのクラスのハッシュになります。ダイナミックプロキシクラスおよび enum 型の serialVersionUID は、常に値 0L になります。
なるほど?
直列化→Serialization→java.io.Serializableに関係する話題
自分が一番なじみのあるのは、JavaのWebアプリのjavax.servlet.http.HttpSessionにsetAttributeするオブジェクトのクラスは、java.io.Serializableをimplementsしてなければならないという仕様だろうか。
Tomcatをシャットダウンするとき、設定によっては、セッションを、セッションが保持しているオブジェクトごとシリアライズしてファイルに保存する。java.io.Serializableをimplementsしてないと例外がでてしまう。
HttpSessionにsetAttributeするオブジェクトのクラスのソースコードを変更すると、再起動後の実行でエラーがでたりするな。
Ruby on Railsを勉強したときに、「そいうことが起きないようにするために、セッションに保持するのは、Stringのようなごく単純な変更が少ないクラスにするとよい」みたいなことが書いてあった。Rubyでも似たようなことが起きるわけか。なるほど。Javaでやるなら、DTO(Stringとか単純な型のフィールド)をMapに詰め替えるとかだろうか?http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/package-summary.htmlに便利クラスはあるかな?
あるいは、セッションをレプリケーションするときも、java.io.Serializableをimplementsしてないと例外がでてしまう。
JavaBeansも
Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle
java.io.Serializable必要だった気がする。
調査不十分かな。つづく。