java private 1l_java中关于 private static final long serialVersionUID = 362498820763181265L的问题...

最近在看源码的时候,突然发现了这个东西,我还发现ArrayList和HashMap的这个值还不一样。

f68663afe06c

ArrayList的serialVersionUID

f68663afe06c

HashMap的serialVersionUID

所以我就奇怪了,这个到底是干什么用的呢,而且我发现我自己写的类里面也有这个,于是我就一顿谷歌,后来总是搞明白了,其实很简单,只是之前自己没有关注这一块。

首先这行代码是和序列化相关的,因为我们知道,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。比如在java中如果想要将对象存储到本地,那是需要将这个对象进行序列化的,序列化成字节存起来,而在需要用的时候,就需要将这个对象进行反序列化,反序列化成对象,那么问题就在这个转换的过程中,会不会有什么猫腻呢?比如序列化和反序列化的不是同一个东西,不就出错了吗,是的,所以,这就是我们这行代码的意义了,进行指定版本,也就是suid,在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。有了SUID之后,那么如果序列化的类已经保存了在本地中,中途你更改了类后,SUID变了,那么反序列化的时候就不会变成原始的类了,主要就是用于版本控制的。

当实现java.io.Serializable接口的实体(类)没有显示定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本用来做比较使用,而默认的是1L,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。那么在实际开发中,重新编译会影响项目进度部署,所以我们为了提高开发效率,不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本,未作更改的类,就需要显式地定义一个名为serialVersionUID,类型为long的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。

总结就是这玩意就是比较版本的,没有啥特殊意义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值