为什么要将类标记为可序列化?

时间:2009-05-18 14:42:23

标签: java serialization

如果已经在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一个类可以被序列化。 (这只是为了避免例外吗?)。

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

感谢任何帮助。

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

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

  • 操作系统资源,如窗口,图像等