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

时间:2014-01-06 01:45:32

标签: java serialization

所以我知道我最终可能会弄明白,但我找不到能回答这个看似简单问题的话题。

我正在序列化一组对象的向量,每个对象都属于一个用户定义的类。我知道矢量是可序列化的。我是否还必须使用户定义的类实现可序列化?并且,这些用户定义的类中的每一个都包含其他用户定义的类。那些必须被标记为实现Serializable吗? (依此类推,或只是顶级类需要实现Serializable)?

(忘了注意应该使用arrayLists而不是vector,我之前听说过,我正在练习,因为我听说矢量对于多线程很有用。我找到了讨论相似内容的主题,但不是这个)

由于

3 个答案:

答案 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());
    }
...