如何在Java中对列表进行序列化?

87

我想要深度克隆一个List,为此我们有一个方法:

// apache commons method. This object should be serializable
SerializationUtils.clone ( object ) 

现在我想克隆我的List,我应该先将其转换为Serializable。是否可以将List转换为Serializable列表?

3个回答

183

所有标准的java.util.List实现已经实现了java.io.Serializable

所以,即使java.util.List本身不是java.io.Serializable的子类型,只要你知道它是像ArrayListLinkedList这样的标准实现之一,将该列表转换为Serializable应该是安全的。

如果你不确定,那么先复制列表(使用类似于new ArrayList(myList)的方法),然后你就知道它是可序列化的。


1
为什么会有人想把任何东西强制转换为Serializable? Serializable只是一个标记接口;将某个东西强制转换为Serializable并没有用处。 - Jesper
21
因为 SerializationUtils.clone() 方法需要一个类型为 Serializable 的参数,所以如果你的变量类型是 List,你需要进行强制类型转换。 - skaffman
2
@Jesper:这是一个标记接口,表示可以安全地序列化该类。Android在许多方面使用Serializable接口;传递意图附加项、共享首选项等。 - Zack Marrapese
11
我在搜索Android解决方案时发现了这个问题。我的补充是,List<MyClass> myObjs = new ArrayList<MyClass>();不符合Serializable,但ArrayList<MyClass> myObjs = new ArrayList<MyClass>();符合要求。 - Evi Song
3
@Adam,最好在编译时通过使用签名<T extends List<Foo>&Serializable> setFooList(T list)来保证安全性,该签名要求调用方向您传递一个同时实现了List和Serializable接口的List实现的实例。请注意不改变原意,尽量让翻译通俗易懂。 - Theodore Murdock
显示剩余2条评论

36

如已经指出的那样,大多数标准的List实现都是可序列化的。但是您必须确保列表中引用/包含的对象也是可序列化的。


2
正如已经指出的那样,List是一个不扩展Serializable或任何扩展它的接口的接口。虽然在标准库中不太常见不可序列化的List,但这并不意味着第一句话是正确的。 - arne.b
列表本身并不是可序列化的,但像ArrayList这样的实现类是可序列化的。您可以使用它们。 - MG Developer

15

List 只是一个接口。问题是:你实际使用的 List 实现是否可以进行序列化?就 Java 运行时的标准 List 实现(ArrayListLinkedList)而言,它们中的大多数已经可以。


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