serialVersionUID作用:

序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。

序列化ID起着关键的作用,java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。反序列化时,JVM会把传来的字节流中的serialVersionUID与本地实体类中的serialVersionUID进行比较,如果相同则认为是一致的,便可以进行反序列化,否则就会报序列化版本不一致的异常。

  • 序列化:是把对象的状态信息转化为可存储或传输的形式过程,也就是把对象转化为字节序列的过程称为对象的序列化。
  • 反序列化:是序列化的逆向过程,把字节数组反序列化为对象,把字节序列恢复为对象的过程称为对象的反序列化。

Serializable序列化的工作机制:
序列化的时候系统会把当前类的serialVersionUID 写入序列化的文件中(也可能是其他中介),当反序列化的时候系统会去检测文件中的serialVersionUID ,看它是否和当前类的serialVersionUID 一致,如果一致就说明序列化的类的版本和当前类的版本是相同的,这个时候可以成功反序列化,否则就说明当前类和序列化的类相比发生了某些变换,比如成员变量的数量,类型可能发生了改变,这个时候就会抛异常,反序列化失败。
serialVersionUID 生成:

默认情况下,也就是不声明serialVersionUID 属性情况下,系统会按当前类的成员变量计算hash值并赋值给serialVersionUID 。

声明serialVersionUID ,可以很大程度上避免反序列化过程的失败。比如当版本升级后,我们可能删除了某个成员变量,也可能增加了一些新的成员变量,这个时候我们的反序列化依然能够成功,程序依然能够最大程度地恢复数据,相反,如果不指定serialVersionUID ,程序就会挂掉。

如果类结构发生了非常规性改变,比如修改了类名,类型等,这个时候尽管serialVersionUID 验证通过了,但是反序列化过程

还是会失败,因为类结构有了毁灭性的改变。

最新文章

  1. VNC connect:Connection refused(10061)
  2. Excel文件下载功能
  3. Linux启动/停止/重启Mysql数据库的方法
  4. WebView加载本地Html文件并实现点击效果
  5. NOJ1019-计算二叉树的高度和结点数
  6. iOS 进阶 第十六天(0419)
  7. 解决duilib使用zip换肤卡顿的问题:修改duilib并使用资源文件换肤
  8. 40 个重要的 HTML5 面试问题及答案
  9. dojo demo, server验证username是否已经被使用
  10. 《金领简历:敲开苹果、微软、谷歌的大门》【PDF】下载
  11. orcl数据库锁等级研究小记
  12. 一)surging 微服务框架使用系列之surging 的准备工作rabbitmq安装(转载 https://www.cnblogs.com/alangur/p/8339905.html)
  13. 利用nginx,腾讯云免费证书制作https
  14. 【SQL】小心在循环中声明变量——浅析SQL变量作用域
  15. maven添加settings.xml使用阿里云仓库
  16. UVa 11636 - Hello World! 二分,水题 难度: 0
  17. [0day]微软XP系统右键菜单任意DLL却持
  18. JSPatch - 基本使用和学习
  19. HDU 2504 又见GCD (最大公因数+暴力)
  20. 总结js(1)

热门文章

  1. [项目总结]Android 手动显示和隐藏软键盘
  2. Java中的Date和时区转换
  3. GO瞬间并发数控制
  4. my40_MySQL锁概述之意向锁
  5. VueAPI 2 (生命周期钩子函数)
  6. 【Linux卷管理】LVM原理
  7. 测试JDBCUtils的重用性
  8. vue+element项目中动态表格合并
  9. eslint使用和配置
  10. 第45篇-查找native方法的本地实现函数native_function