解决java.util.ArrayList$SubList notSerializable异常

30

我正在使用List类型对象上的SubList函数。问题在于,由于java.util.ArrayList$SubList是由非可序列化类实现的,而我正在使用RMI,因此当我尝试将结果对象传递给以List为参数的远程函数时,就会出现上述异常。

我已经发现,应该将结果列表复制到一个新的LinkedList或ArrayList中并传递。

有没有人知道一个函数可以帮助我们轻松完成这个操作?

List<String> list = originalList.subList(0, 10);

4
您可以非常容易地复制一个列表。ArrayList 构造函数可以接受一个现有的集合(包括您的子列表)作为参数,并执行复制。 - Afforess
@Afforess抄袭了我的答案。只需将其复制到您知道可序列化的列表中即可。 - markspace
好的,谢谢。这是我使用 ArrayList 做的! - Othmane
@Afforess 为什么不把你的评论发表为答案呢?这样问题提出者就可以接受你的答案了。 - eee
2个回答

67
这是因为 subList() 方法返回的 List 实例是 RandomAccessSubList 类型,而该类型不可序列化。因此需要使用 subList() 返回的 List 创建一个新的 ArrayList 对象。
List<String> list = new ArrayList<String>(originalList.subList(0, 10));

8
解决方案非常简单,只需使用以下代码:
ArrayList<String> list = new ArrayList<String>();
list.addAll(originalList.subList(0, 10));

7
另一种提出的解决方案更好,因为它将一次性预先分配完整的大小,而不是可能需要先分配默认大小,然后在添加元素时重新分配子列表的空间。 - Daniel Gray
如果你关心性能,就不应该创建两个相同的子列表。 - Jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接