如果我有一些集合Collection<SomeClass> classes;
可以按原样序列化吗?或者我是否必须将其声明为ArrayList,HashSet或其他实现Serializable的具体实现?如果是这样,这样做的一般做法是什么?
答案 0 :(得分:2)
JDK中的所有Collection
实现都是Serializable
:即使Collection
接口没有扩展Serializable
,所有实现(例如ArrayList
,HashSet
等),请实施Serializable
。
除非您使用特殊的(您自己的或来自库)非序列化集合类,并且只使用中的对象类集合(示例中为SomeClass
)他们自己是Serializable
,你不必担心。
答案 1 :(得分:1)
只要SomeClass
可序列化,java.util.collection
个SomeClass
个对象的标准 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
(实际上Set
,Collection
或其他-interfaces),这些接口的所有标准实现做。此外,当您调用序列化实现ArrayList
的对象时,它将被序列化为其具体类的对象(在上述测试的情况下,Collection
)。当然,当您序列化仅由序列化方法的接口知道的对象时,情况总是如此。
所以,回答你的问题(这是一个有趣的问题):从技术上讲,没有,Serializable
本身不是可序列化的,是,一个确实需要是一个实现Collection
(标准实现或自定义实现)的类才能被序列化。但是,实际上, 不,您不需要将集合强制转换为实现以进行序列化,因为Java会为您执行此操作 。
为了进一步说明这一点:您可以使用一个方法来序列化任意NotSerializableException
实现(例如我的示例中的实现),并且只有非Collection
的情况下才会生成{{1}}将未实现Serializable 的标准{{1}}实现传递给它。