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