如何在Java中序列化列表?


81

我想深入克隆一个列表。为此,我们有一种方法

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

所以现在要克隆我的列表,我应该先将其转换为可序列化的。是否可以将列表转换为可序列化列表?

Answers:


162

java.util.List已实施的所有标准实施java.io.Serializable

因此,即使它java.util.List本身不是的子类型java.io.Serializable,也可以安全地将列表强制转换为Serializable,只要您知道它是诸如ArrayList或的标准实现之一LinkedList

如果不确定,请先复制列表(使用new ArrayList(myList)),然后知道它是可序列化的。


1
为什么有人会想要将任何内容投射到Serializable?可序列化只是一个标记接口;将某些内容强制转换为Serializable并没有用。
杰斯珀,

19
因为SerializationUtils.clone()在type上需要一个参数Serializable,所以如果变量的类型是List,则需要强制转换。
skaffman

2
@Jesper:这是一个标记接口,它表明序列化类是安全的。Android在许多方面都使用Serializable接口。沿意图演员,共享偏好等传递
扎克核心提示:

11
是的,我在搜索Android解决方案时发现了这个问题。我的加法是,List<MyClass> myObjs = new ArrayList<MyClass>();不符合Serializable,但ArrayList<MyClass> myObjs = new ArrayList<MyClass>();符合。
Evi Song

2
@Adam最好是在编译时保证安全,而不是使用签名<T extends List<Foo> & Serializable> setFooList(T list),这要求调用者向您传递某些List实现的实例,该实现也是可序列化的。
Theodore Murdock

32

如前所述,大多数标准实现List都是可序列化的。但是,您必须确保列表中引用/包含的对象也可以序列化。


1
如前所述,List是不扩展的接口Serializable或任何不扩展的接口。List不可序列化的s在标准库中可能并不常见,但这并不能使第一句话正确。
arne.b 2012年

13

列表只是一个接口。问题是:您的实际List实现是否可序列化?说起Java运行时的标准List实现(ArrayListLinkedList),实际上大多数已经实现了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.