什么是序列化?什么是反序列化?

什么是序列化,序列化就是把 Java 对象转为二进制流,方便存储和传输。

所以反序列化就是把二进制流恢复成对象

javase-30.png

类比我们生活中一些大件物品的运输,运输的时候将其拆开打包,用的时候再拆包组装。

Serializable 接口的作用是什么?

Serializable 接口只是一个标记接口,没有具体的功能。但是如果一个类实现了 Serializable 接口,在某些序列化场景下就不会报错。因此,一般建议创建的 JavaBean 类都实现 Serializable 接口。

serialVersionUID 的作用是什么?

serialVersionUID 用于验证序列化的对象和反序列化得到的对象是否对应。

private static final long serialVersionUID = 1L;

我们经常看到这样的代码,其中 serialVersionUID 就是用来验证序列化对象和反序列化对象的 ID 是否一致。

实际上,这个 ID 的具体数值并不重要,无论是 1L 还是由 IDE 自动生成的,只要在序列化时对象的 serialVersionUID 和反序列化时对象的 serialVersionUID 一致即可。

如果没有显式指定 serialVersionUID,编译器会根据类的相关信息自动生成一个值,可以将其视为一个指纹。

因此,如果你没有定义 serialVersionUID,并且在序列化对象后,在反序列化之前改变了对象的类结构(例如增加了一个成员变量),那么反序列化将会失败。

原因是类的结构发生了变化,导致 serialVersionUID 不一致。

Java 序列化是否包含静态变量?

在序列化过程中,静态变量是不会被包含在序列化中的。

如果某些变量不想进行序列化,应该如何处理?

对于不希望进行序列化的变量,可以使用 transient 关键字进行修饰。

transient 关键字的作用是阻止实例中被标记的变量进行序列化。当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。需要注意的是,transient 只能修饰变量,不能修饰类和方法。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题