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

Java 为什么需要将类标记为可序列化?,java,serialization,Java,Serialization,如果stackoverflow上已经发布了类似的问题,请发布链接。 为要序列化的对象实现可序列化接口(没有方法)需要什么? JavaAPI说- -如果未实现,则将抛出java.io.NotSerializableException 这是因为ObjectOutputStream.java中有以下代码 ............................ writeObject0(Object obj, boolean unshared){ ............. } else if (

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

为要序列化的对象实现可序列化接口(没有方法)需要什么? JavaAPI说- -如果未实现,则将抛出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());
        }
................
但我的问题是,为什么必须实现可序列化,从而通知或告诉Java/JVM类可以序列化。(这只是为了避免例外吗?。

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


感谢您的帮助

这是个好问题。Serializable被称为,可以被视为类上的标记,以标识它具有功能或行为。e、 g.您可以使用它来标识要序列化但未定义serialVersionUid的类(这可能是一个错误)


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

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

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

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

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

  • I/O材料:输入流、HTTP连接、通道。它们依赖于在JavaVM范围之外创建的对象,并且没有简单的方法来恢复它们

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


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

这是对“为什么序列化有用?”问题的回答,但也回答了为什么为了使用二进制文件和写/读对象,必须将其标记为可序列化。对这个问题有一些很好的答案