只要SomeClass是可序列化的,SomeClass对象的任何标准java.util.collection都是可序列化的.
我一直认为这是因为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());
}
打印的内容是:“class java.util.ArrayList”
因此,我们可以从中获得的是,虽然Collection接口不直接扩展Serializable(实际上也没有扩展List,Set或其他子接口),但这些接口的所有标准实现都可以.此外,当您调用序列化实现Collection的对象时,它将被序列化为其具体类的对象(在上述测试的情况下,为ArrayList).当然,当您序列化仅由序列化方法的接口知道的对象时,情况总是如此.
所以,回答你的问题(这是一个有趣的问题):从技术上讲,不,Collection本身并不是可序列化的,是的,确实需要是一个实现Serializable(标准实现或自定义)的类.为了序列化.但是,在实践中,不,您不需要将集合强制转换为实现以序列化它,因为Java会为您执行此操作.
为了进一步说明这一点:您可以使用一个序列化任意Collection实现的方法(例如我的示例中的那个),并且只有在未实现Serializable的非标准Collection实现传递到的情况下才会导致NotSerializableException它.