java基础----serialVersionUID及序列化详解

引言:在开发项目时,我们经常会看到在实体DTO中有一行 private static final long serialVersionUID = 1L; 的,那么这个serialVersionUID是用来干嘛的呢?不加貌似也没事?
java基础----serialVersionUID及序列化详解_第1张图片


serialVersionUID是用来干什么的

serialVersionUID是类的序列化版本,适用于java序列化机制,因此在实现了serializable接口时才有意义。java在反序列化时会验证本地类版本与IO流中的类版本是否一致,若一致则会进行序列化IO流为对象的过程,不一致则会抛出Invalid Class Exception中止序列化

为什么要手动设置serialVersionUID?

若不显示地设置serialVersionUID的值,java会自动地根据类的包名、类名、继承关系、属性名、参数、返回值等诸多因子,计算得出一个64位的hash值,如-713054971715734723。而当任意一个因子变了,如类新增了一个属性,类的serialVersionUID也就会变。
想象这么一个场景:我先将一个student对象序列化到了一个文件里,因为需求迭代等原因给Student类加(或减)了一个属性,这时候Student类的serialVersionUID就会发生变化。而之后再去将文件中的对象反序列化到内存中,就会有由于serialVersionUID不一致而反序列化失败。但这并不是我们想要的,加了个字段大不了反序列化出来的字段为空就可以了,别给我失败呀!
因此我们显示地设置一个serialVersionUID值(至于是啥值就无所谓),就可避免上述问题。

你可能感兴趣的:(Java,java,后端)