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

7

我知道我可能最终可以弄清楚它,但我找不到一个回答这个看似简单问题的主题。

我正在对一组对象的向量进行序列化,每个这样的对象都与用户定义的类相关联。 我知道向量是可序列化的。 我是否还需要使用户定义的类实现Serializable接口? 而且,每个这些用户定义的类都包含其他用户定义的类。 那些也必须被标记为实现Serializable接口吗? (以此类推,或者只需顶层类实现Serializable接口)?

(忘记注意应该使用ArrayList而不是Vector,我之前听说过,我正在练习因为我听说Vector适用于多线程。 我找到了讨论类似内容的主题,但不是完全相同的)

谢谢


实际上,Vector 已经或多或少被弃用了。如果你想要一个线程安全的 List,Collections.synchronizedList 更好。或者只需手动在列表上同步,因为你可能需要这样做来避免写入时的竞争条件。 - yshavit
好的,谢谢,知道了。我最开始学习的是C ++,因此我使用向量。在C ++中,向量也被弃用了吗? - squirrelsareduck
抱歉,我自上世纪以来就没有写过C++了。 :) - yshavit
@squirrelsareduck 只是想提一下,我去年学习 C++ 时,链表和向量等数据结构被教授为主要内容的一部分,就好像它们仍然是解决许多不同问题的完全可行的解决方案一样。它们各自具有用于减少访问某些元素所需时间的用途,因为它们在内部的构造方式不同。我不确定你是否需要在 Java 开发中深入研究此问题,但对于 C++ 开发来说似乎更为关键。 - Jake Millington
顺便说一下,我在大学学习了这个。 - Jake Millington
显示剩余2条评论
3个回答

7

是的,你说得对:任何被序列化的东西,包括所有被字段(实例变量)引用的类,都必须要实现Serializable接口,或者该字段必须是transient

在你的情况下,用户定义的类必须实现Serializable接口,并且具有类型为Serializable的字段。这递归地应用于字段的类的字段,依此类推。

transient关键字告诉序列化机制忽略该字段以进行序列化。


2
根据Serializable文档:
当遍历图时,可能会遇到不支持Serializable接口的对象。在这种情况下,将抛出NotSerializableException并标识非可序列化对象的类。
因此,是的,向量直接和间接引用的所有对象都需要是可序列化的,除非它们被标记为transient

1
理论上,您可以使用自定义序列化实现自定义向量并序列化非可序列化的对象,就像这里一样。
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());
    }
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接