最近在看源码的时候,突然发现了这个东西,我还发现ArrayList和HashMap的这个值还不一样。
ArrayList的serialVersionUID HashMap的serialVersionUID所以我就奇怪了,这个到底是干什么用的呢,而且我发现我自己写的类里面也有这个,于是我就一顿谷歌,后来总是搞明白了,其实很简单,只是之前自己没有关注这一块。
首先这行代码是和序列化相关的,因为我们知道,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。比如在java中如果想要将对象存储到本地,那是需要将这个对象进行序列化的,序列化成字节存起来,而在需要用的时候,就需要将这个对象进行反序列化,反序列化成对象,那么问题就在这个转换的过程中,会不会有什么猫腻呢?比如序列化和反序列化的不是同一个东西,不就出错了吗,是的,所以,这就是我们这行代码的意义了,进行指定版本,也就是suid,在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。有了SUID之后,那么如果序列化的类已经保存了在本地中,中途你更改了类后,SUID变了,那么反序列化的时候就不会变成原始的类了,主要就是用于版本控制的。
当实现java.io.Serializable接口的实体(类)没有显示定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本用来做比较使用,而默认的是1L,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。那么在实际开发中,重新编译会影响项目进度部署,所以我们为了提高开发效率,不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本,未作更改的类,就需要显式地定义一个名为serialVersionUID,类型为long的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。
总结就是这玩意就是比较版本的,没有啥特殊意义
网友评论