通用集合可以序列化吗?

时间:2014-05-30 01:40:27

标签: java arrays generics serialization collections

如果我有一些集合Collection<SomeClass> classes;可以按原样序列化吗?或者我是否必须将其声明为ArrayList,HashSet或其他实现Serializable的具体实现?如果是这样,这样做的一般做法是什么?

2 个答案:

答案 0 :(得分:2)

JDK中的所有Collection实现都是Serializable:即使Collection接口没有扩展Serializable,所有实现(例如ArrayListHashSet等),请实施Serializable

除非您使用特殊的(您自己的或来自库)非序列化集合类,并且只使用中的对象类集合(示例中为SomeClass)他们自己是Serializable,你不必担心。

答案 1 :(得分:1)

只要SomeClass可序列化,java.util.collectionSomeClass个对象的标准 Collection将是可序列化的。

我一直认为这是因为Serializable界面本身扩展了public class Test { static final String filename = "d:/desktop/employee.txt"; Collection makeColl(){ return new ArrayList(); } void writeColl(Collection c){ try { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("d:/desktop/employee.txt")); out.writeObject(c); out.close(); } catch(IOException i){i.printStackTrace();} } Collection readColl(){ Object that = null; try { ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName)); that = in.readObject(); } catch(IOException | ClassNotFoundException i) { i.printStackTrace(); } return that; } public static void main(String[] args) { Test t = new Test(); t.writeColl(t.makeColl()); System.out.println(t.readColl().getClass()); } ,但是 - 正如你在评论中指出的那样 - 事实并非如此。所以,我运行了以下测试:

Collection

打印的内容是:“class java.util.ArrayList”

因此,我们可以从中获得的是,虽然Serializable界面不会直接扩展List(实际上SetCollection或其他-interfaces),这些接口的所有标准实现。此外,当您调用序列化实现ArrayList的对象时,它将被序列化为其具体类的对象(在上述测试的情况下,Collection)。当然,当您序列化仅由序列化方法的接口知道的对象时,情况总是如此。

所以,回答你的问题(这是一个有趣的问题):从技术上讲,没有Serializable本身不是可序列化的,,一个确实需要是一个实现Collection(标准实现或自定义实现)的类才能被序列化。但是,实际上, 不,您不需要将集合强制转换为实现以进行序列化,因为Java会为您执行此操作

为了进一步说明这一点:您可以使用一个方法来序列化任意NotSerializableException实现(例如我的示例中的实现),并且只有非Collection的情况下才会生成{{1}}将未实现Serializable 的标准{{1}}实现传递给它。