【问题标题】:Why its required to mark a class as serializable?为什么需要将类标记为可序列化?
【发布时间】:2009-05-18 14:42:23
【问题描述】:

如果 stackoverflow 上已经发布了类似的问题,请发布链接。

什么需要为要序列化的对象实现 Serializable 接口(没有方法)? Java API 说 - - 如果它没有实现,那么它会抛出 java.io.NotSerializableException。

这是因为 ObjectOutputStream.java 中的以下代码

............................

writeObject0(Object obj, boolean unshared){
.............
 } else if (cl.isArray()) {
        writeArray(obj, desc, unshared);
        } else if (obj instanceof Serializable) {
        writeOrdinaryObject(obj, desc, unshared);
        } else {
        throw new NotSerializableException(cl.getName());
        }
................

但我的问题是为什么有必要实现 Serializable 从而通知或告诉 Java/JVM 一个类可以被序列化。 (只是为了避免例外吗?)。

在这种情况下,如果我们编写一个类似的功能,将对象写入流而不检查 instanceOf 中的类是否可序列化,那么类的对象是否不会实现 Serializable 序列化?

感谢任何帮助。

【问题讨论】:

标签: java serialization


【解决方案1】:

这是个好问题。 Serializable 被称为marker interface,可以被视为类上的标签,以将其标识为具有功能或行为。例如您可以使用它来识别您想要序列化的未定义 serialVersionUid 的类(这可能是一个错误)。

请注意,常用的序列化库 XStream(和其他)不需要定义 Serializable。

【讨论】:

    【解决方案2】:

    它是必需的,以便 JVM 可以知道一个类是否可以安全地序列化。有些东西(例如数据库连接)包含无法真正序列化的状态或与外部资源的连接。

    此外,您需要确保在每个可序列化类中放置一个 serialVersionUID 成员,以确保在代码更改或重新编译后可以反序列化序列化对象:

    // Set to some arbitrary number.  
    // Change if the definition/structure of the class changes.
    private static final long serialVersionUID = 1;
    

    【讨论】:

      【解决方案3】:

      序列化允许您将对象直接保存到二进制文件中,而不必将它们解析为文本,将字符串写出然后创建一个新对象,并在读回时解析字符串输入。主要目的是让您将对象及其所有数据保存到二进制文件中。我发现它在处理包含大量相同类型对象的链表时非常有用,我需要保存并打开它们。

      【讨论】:

      • 这是对“为什么序列化有用?”问题的答案
      • 但它也回答了为什么必须将其标记为可序列化才能使用二进制文件和写入/读取对象。
      【解决方案4】:

      原因是不是所有的类都可以序列化。例子:

      • I/O 内容:InputStream、HTTP 连接、通道。它们依赖于在 Java VM 范围之外创建的对象,并且没有简单的方法可以恢复它们。

      • Windows、图像等操作系统资源

      【讨论】:

        猜你喜欢
        • 2010-12-08
        • 2012-02-25
        • 2011-02-28
        • 2022-12-22
        • 1970-01-01
        • 2011-12-02
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        相关资源
        最近更新 更多