List.subListはSerializeできない

2014/07/23

ArrayListはSerializableだが、subListで取得したListはRandomAccessSubListが実体で、Serializeできない。
HttpSession等はSerializableしか受け付けてくれないので、うっかりSubListを渡さないようにしなければならない。

Listのシリアライズの検証

出力結果
asList: serializable = true
java.io.NotSerializableException
Arrays.asList(subList.toArray()): serializable = true
new ArrayList(subList): serializable = true
java.io.NotSerializableException

SubListをシリアライズ可能にするには、Arrays.asList(subList.toArray())かnew ArrayList(subList)でSubListをラッピングしてあげればいい。

注意すべきはCollectionsクラス。内部でlist instanceof RandomAccessを判断していて、RandomAccessインタフェースをimplementしたクラスを返すため、Serializeできない問題が残る。

-Java