[英]Serialization Java: which classes need to “implement Serializable”?
所以我知道我最终可能会弄明白,但我找不到能回答这个看似简单问题的话题。
我正在序列化一组对象的向量,每个对象都属于一个用户定义的类。 我知道矢量是可序列化的。 我是否还必须使用户定义的类实现可序列化? 并且,这些用户定义的类中的每一个都包含其他用户定义的类。 那些必须被标记为实现Serializable吗? (依此类推,或只做顶级类需要实现Serializable)?
(忘了注意应该使用arrayLists而不是vector,我之前听说过,我正在练习,因为我听说矢量对多线程很有用。我找到了讨论相似内容的主题,但不是这个)
谢谢
是的,你是对的:任何被序列化的东西,包括字段引用的所有类(实例变量),都必须实现Serializable
, 或者字段必须是transient
。
在您的情况下,用户定义的类必须实现Serializable
,并且具有类型为Serializable
字段。 这是递归应用的,因此字段类的字段也必须是Serializable
等。
transient
关键字告诉序列化机制忽略该字段以进行序列化。
从Serializable
文档:
遍历图形时,可能会遇到不支持Serializable接口的对象。 在这种情况下,将抛出NotSerializableException,并将标识非可序列化对象的类。
所以是的,矢量直接和间接引用的所有对象都需要是Serializable
,除非它们被标记为transient
。
从理论上讲,您可以使用自定义序列化实现自定义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());
}
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.