Java序列化-为什么要实现Serializable接口/serialVersionUID作用是什么

在日常编码中,经常看到一些实体类实现了Serializable接口,不禁会问,为什么要实现这个接口?浅显的回答就是为了序列化,那么,再深挖一点呢?

为什么要序列化?

网络中的数据传输和磁盘的数据存储都是二进制方式,序列化就是为了把java对象转成二进制进行传输和存储。

Serializable接口的作用

1、Serializable是一个空接口,目的就是为了告诉JVM这个类帮忙序列化一下
2、实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象,不实现序列化的时候就会报错
Java序列化-为什么要实现Serializable接口/serialVersionUID作用是什么

serialVersionUID作用是什么

Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。
在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException。

如果不显式指定,那么会根据类的属性自动生成一个serialVersionUID,如果类做了改动,则serialVersionUID会变更,序列化失败
不想因为修改类属性导致序列化失败可以显式定义serialVersionUID

测试代码:

Java序列化-为什么要实现Serializable接口/serialVersionUID作用是什么

1、一开始未实现序列化接口

Java序列化-为什么要实现Serializable接口/serialVersionUID作用是什么

2、实现序列化接口

成功序列化并取出
Java序列化-为什么要实现Serializable接口/serialVersionUID作用是什么

3、序列化之后,新增类属性yaer,观察反序列化结果

反序列化失败,因为修改了类属性,导致自动生成的serialVersionUID
Java序列化-为什么要实现Serializable接口/serialVersionUID作用是什么

4、显式定义serialVersionUID,序列化后新增类属性ss1

反序列化成功,但是新增的类属性值为空
反序列化方法中输出了新增的字段ss1
Java序列化-为什么要实现Serializable接口/serialVersionUID作用是什么