序列化与反序列化

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

  1. Serializable 接口有什么用?

这个接口只是一个标记,没有具体的作用,但是如果不实现这个接口,在有些序列化场景会报错,所以一般建议,创建的 JavaBean 类都实现 Serializable。

  1. serialVersionUID 又有什么用?
    serialVersionUID 就是起验证作用。
private static final long serialVersionUID = 1L;

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

这个 ID 的数字其实不重要,无论是 1L 还是 IDE 自动生成的,只要序列化时候对象的 serialVersionUID 和反序列化时候对象的 serialVersionUID 一致的话就行。

如果没有显示指定 serialVersionUID ,则编译器会根据类的相关信息自动生成一个。

所以如果你没有定义一个 serialVersionUID, 结果序列化一个对象之后,在反序列化之前把对象的类的结构改了,比如增加了一个成员变量,则此时的反序列化会失败。

因为类的结构变了,所以 serialVersionUID 就不一致。

  1. Java 序列化不包含静态变量?

序列化的时候是不包含静态变量的。

  1. 如果有些变量不想序列化,怎么办?

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

transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。transient 只能修饰变量,不能修饰类和方法。

你可能感兴趣的:(java,jvm,开发语言)