Optionalは意図的にSerializableではなくなってますね。
でその意図としては、一旦Serializableにして出力形式を決めてしまうと、今後ずっとその出力形式を維持しないといけないことになるので、そのメンテナンスコストを嫌ったというのがあるようです。
このメンテナンスコストの中には、仕様が変えれなくなる、というコストも含みます。
なので、シリアライズしたい場合には、フィールドはnullを持つようにして、getterでOptionalに変換するということになると思います。
基本的にOptionalは、Optional-returnイディオムをサポートするもの以上ではない、ということをBrian goetzさんも書いています。
Shouldn't Optional be Serializable?
そこで、Optionalの使い方としては、基本的にメソッドの戻り値としてだけ、となりフィールドには使わないほうがいいということになります。
Stephen Colebourneさんは次のように書いてます
- Do not declare any instance variable of type Optional.
- Use null to indicate optional data within the private scope of a class.
- Use Optional for getters that access the optional field.
- Do not use Optional in setters or constructors.
- Use Optional as a return type for any other business logic methods that have an optional result.
Stephen Colebourne's blog: Java SE 8 Optional, a pragmatic approach
こんな感じですね。
- インスタンスフィールドにOptionalは使わない
- プライベートスコープではnullを使う
- getterにはOptionalを使う
- setterやコンストラクタではOptionalを使わない
- メソッドの戻り値にはOptionalを使う
ただ、このとおりにやるとvoid setSome(Some some)/Optional