繁体   English   中英

序列化Java:哪些类需要“实现Serializable”?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM