所以我知道我最终可能会弄明白,但我找不到能回答这个看似简单问题的话题。
我正在序列化一组对象的向量,每个对象都属于一个用户定义的类。我知道矢量是可序列化的。我是否还必须使用户定义的类实现可序列化?并且,这些用户定义的类中的每一个都包含其他用户定义的类。那些必须被标记为实现Serializable吗? (依此类推,或只是顶级类需要实现Serializable)?
(忘了注意应该使用arrayLists而不是vector,我之前听说过,我正在练习,因为我听说矢量对于多线程很有用。我找到了讨论相似内容的主题,但不是这个)
由于
答案 0 :(得分:5)
是的,你是对的:任何被序列化的东西,包括字段引用的所有类(实例变量),必须实现Serializable
,或字段必须是transient
在您的情况下,用户定义的类必须实现Serializable
,并且字段的类型为Serializable
。这是递归应用的,因此字段类的字段也必须是Serializable
等。
transient
关键字告诉序列化机制忽略该字段以进行序列化。
答案 1 :(得分:1)
来自Serializable
文档:
遍历图形时,可能会遇到不支持Serializable接口的对象。在这种情况下,将抛出NotSerializableException,并将标识非可序列化对象的类。
所以,矢量直接或间接引用的所有对象都需要Serializable
,除非它们被标记为transient
。
答案 2 :(得分:1)
理论上,您可以使用自定义序列化实现自定义Vector并序列化不可序列化的对象,例如此处
class Y {
int y;
Y(int y) {
this.y = y;
}
}
class X implements Serializable {
transient Y y;
private void writeObject(ObjectOutputStream os) throws IOException {
os.defaultWriteObject();
os.writeInt(y.y);
}
private void readObject(ObjectInputStream is) throws ClassNotFoundException, IOException {
is.defaultReadObject();
y = new Y(is.readInt());
}
...