为什么对象里面有 private static final long serialVersionUID = 1L(语言-java)

为什么业务BO对象不需要序列化反序列化,其他两个对象怎么需要呢
什么时候需要序列化反序列化

img

为什么对象里面有 private static final long serialVersionUID = 1L;

img

img

这行代码的意思是将SerialVersionUID的值定义为一个常量。
你要了解包含SerialVersionUID的Serializable接口是什么?
Serializable:一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。Serializable是java.io包中定义的、用于实现Java类的序列化操作而提供的一个语义级别的接口。Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。

实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象。例如,我们可以将序列化对象写入文件后,再次从文件中读取它并反序列化成对象,也就是说,可以使用表示对象及其数据的类型信息和字节在内存中重新创建对象。

什么是序列化?
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。

为什么要定义serialVersionUID为private,static,final来修饰
serialVersionUID叫做流标识符,即类的版本定义,作用是在序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。jvm在反序列化的时候先去对比这个版本名字,如果数据流中的serialVersionUID和类中的serialVersionUID相同,才会进行反序列化,而不同的话就会抛出异常。一般来说,如果你对一个实现了serializable接口的类进行修改之后,需要修改这个版本信息。serialVersionUID可以显示声明也可以隐式声明。隐式声明是通过包名,类名等多个因素计算出来的,而显示声明就是通过赋值自己设置。

如果你不写private static final long serialVersionUID = 1L,在对这个类进行修改时,若你忘记修改serialVersionUID,版本上就会出现不兼容的问题,于是就会出现反序列化报错的情况

如果你显示定义了private static final long serialVersionUID = 1L,在对这个类进行修改时,若你忘记修改serialVersionUID,这个类也能被进行反序列化,它就会自动向上兼容版本,不会报错。

serialVersionUID:定义为代表类定义的版本,在反序列化时,jvm会将字节流状态的类中的serialVersionUID与本地类中的serialVersionUID进行比较,如果相同,则进行序列化,不相同就抛InvalidClassException异常。

private static final 将其标识为一个私有的静态常量,因为他没有实际的业务意义,只是为了序列化和反序列化时使用


private,static,final
static 意味着这个变量不依赖与实例化对象,只要类被加载到JVM中就会存在。
同时final意味着这个变量无法被再次修改。