java 序列化随机生成id java生成序列化码_java


一、什么是序列化

程序存在的意义就是进行数据的计算与传输,在我们的网络架构中只能识别二进制和字节码,而不能识别java对象。序列化就是将无法识别的java对象转化为二进制和字节码的一种机制。

通过一定的规则将 java对象,包括数据和数据类型转换成二进制和字节码 称为序列化。将二进制和字节码还原成 java对象的过程就称为反序列化

二、什么是 serialVersionUID

1、每一个实现序列化接口 Serializable 的java 对象,都有一个 serialVersionUID。

2、serialVersionUID 是唯一的,相当于 java对象的唯一身份标识

3、如果没有显示声明,java 对象 serialVersionUID 会根据类中的数据、结构生成。也就是说,一旦修改了 java 对象,serialVersionUID 也会不同

4、为了保证,在对java 对象添加一个方法,或者修改某个数据 不会发生无法反序列化的结果,这是就要指定 serialVersionUID 。保证 反序列化的正常执行。

三、Java原生序列化实操

3.1、测试对象


java 序列化随机生成id java生成序列化码_java_02


3.2、测试部分代码


java 序列化随机生成id java生成序列化码_java_03


构建 `Money` 对象,并进行序列化和反序列化的操作,并将序列化后的数据持久化到磁盘文件中。

3.3、模拟操作1

step1、在没有在没有显示声明 serialVersionUID 下,执行序列化操作,持久化到文件中。

step2、修改 Money 对象,新增一个属性

step3、进行反序列化,将文件中的数据反序列化成 Money对象

反序列化失败

3.4、模拟操作2

step1、显示声明 serialVersionUID 下,执行序列化操作,持久化到文件中。

step2、修改 Money 对象,新增一个属性

step3、进行反序列化,将文件中的数据反序列化成 Money对象

反序列化成功

四、总结

1. 在java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化

2. 通过ObjectOutputStream和ObjectInputStream对对象进行序列化和反序列化操作

3. 对象是否允许被反序列化,不仅仅是取决于对象的代码是否一致,同时还有一个重要的因素(UID)

4. 序列化不保存静态变量

5. 要想父类对象也参与序列化操作,那么必须要让父类也实现Serializable接口

6. Transient关键字,主要是控制变量是否能够被序列化。如果没有被序列化的成员变量反序列化后,会被设置成初始值,比如String -> null

7. 通过序列化操作实现深度克隆