読者です 読者をやめる 読者になる 読者になる

算譜王におれはなる!!!!

偏りはあると思うけど情報技術全般についてマイペースに書くよ。

GuavaのLists#transformが返すリストはシリアライズできないんだね

Java メモ

Androidアプリをジャバで書くならGuavaは、僕にとって必要不可欠なライブラリだ。 リストをmapする操作は頻出するパターンなのでLists#transform(List, Function)メソッドがないと生きて行けない。

タイトルの通りなんだけど、このLists#transformメソッドが返すリストはシリアライズできない。そのことを知らずにシリアライズしてみたらNotSerializableExceptionが出て悩んだのでメモ 。

Lists#transformの引数のFunctionはすぐには適用されず必要なときまで遅延する。そのためLists#transformが返すリスト(非公開の内部staticクラス)は、引数のFunctionを持っている。で、この非公開の内部staticなリストクラスはSerializableを実装している。ここまではいい。 問題はそのクラスの、transientなフィールドFunctionSerializableではないこと。 それが原因でLists#transformが返すリストはNotSerializableExceptionを吐いてシリアライズに失敗する。

これは...バグ?と思いissueを覗いてみたら同じことを思った人が投稿してた。

https://code.google.com/p/guava-libraries/issues/detail?id=1424

このissue、WorkingAsIntendedということでクローズしてて「ん!?」って一瞬思ったけど読んでみて納得した。 中の人曰く、直列化は実装上の問題だから抽象型をSerializableにするな(だからFunctionSerializableにしない)と。その他にもいろいろ言ってる。

ちなみにシリアライズできない旨がjavadocに明記されてた...。迷ったら、まずドキュメントを読もう...。

Lists#transformが返すリストをシリアライズしたい場合はこうすりゃいい。

List<Foo> list = Lists.transform(fromList, function);
serialize(ImmutableList.copyOf(list));

以上