在IDEA中通过如下设置可以生成serializeid

字面意思上是序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量

演示步骤

1. 先将user对象序列化到文件中

2. 然后修改user对象,增加serialVersionUID字段

3. 然后通过反序列化来把对象提取出来

4. 演示预期结果:提示无法反序列化

结论

Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是
InvalidCastException。

从结果可以看出,文件流中的class和classpath中的class,也就是修改过后的class,不兼容了,处于安全机制考虑,程序抛出了错误,并且拒绝载入。从错误结果来看,如果没有为指定的class配置serialVersionUID,那么java编译器会自动给这个class进行一个摘要算法,类似于指纹算法,只要这个文件有任何改动,得到的UID就会截然不同的,可以保证在这么多类中,这个编号是唯一的。所以,由于没有显指定serialVersionUID,编译器又为我们生成了一个UID,当然和前面保存在文件中的那个不会一样了,于是就出现了2个序列化版本号不一致的错误。因,只要我们自己指定了serialVersionUID,就可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象照样可以使用,而且还多了方法或者属性可以用。

tips: serialVersionUID有两种显示的生成方式:

一是默认的1L,比如:private static final long serialVersionUID = 1L;

二是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段

当实现java.io.Serializable接口的类没有显式地定义一个serialVersionUID变量时候,Java序列化机制会根据编译的Class自动生成一个serialVersionUID作序列化版本比较用,这种情况下,如果Class文件(类名,方法明等)没有发生变化(增加空格,换行,增加注释等等),就算再编译多次,serialVersionUID也不会变化的。

序列化的高阶认识-serialVersionUID的作用相关推荐

  1. 序列化的高阶认识-Transient 关键字

    Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的 ...

  2. 序列化的高阶认识-绕开 transient 机制的办法

    虽然name被transient修饰,但是通过我们写的这两个方法依然能够使得name字段正确被序列化和反序列化 writeObject和readObject原理 writeObject和readObj ...

  3. 序列化的高阶认识-简单认识一下 Java 原生序列化

    前面的代码中演示了,如何通过JDK提供了Java对象的序列化方式实现对象序列化传输,主要通过输出流java.io.ObjectOutputStream和对象输入流java.io.ObjectInput ...

  4. React高阶组件_阶段1

    react高阶组件_阶段1 作用: 个人总结的高阶组件设计的作用主要有两点, 这里直接使用装饰器方式 非装饰器使用请结合我的博文"react基础梳理_阶段1"中的"自定义 ...

  5. React 中的高阶组件及其应用场景

    本文目录 什么是高阶组件 React 中的高阶组件 属性代理(Props Proxy) 反向继承(Inheritance Inversion) 高阶组件存在的问题 高阶组件的约定 高阶组件的应用场景 ...

  6. React高阶组件以及应用场景

    什么是高阶组件 在解释什么是高阶组件之前,可以先了解一下什么是 高阶函数,因为它们的概念非常相似,下面是 高阶函数 的定义: 如果一个函数 接受一个或多个函数作为参数或者返回一个函数 就可称之为 高阶 ...

  7. java 四字节uid,Java入门教程-序列化版本号serialVersionUID的作用

    原标题:Java入门教程-序列化版本号serialVersionUID的作用 Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象.序列化是Java中实现持久化存储的一种方法 ...

  8. java 序列化版本号_序列化版本号serialVersionUID的作用

    原标题:序列化版本号serialVersionUID的作用 Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象.序列化是Java中实现持久化存储的一种方法:为数据传输提供了 ...

  9. Java基础学习笔记(三)_Java核心技术(高阶)

    本篇文章的学习资源来自Java学习视频教程:Java核心技术(高阶)_华东师范大学_中国大学MOOC(慕课) 本篇文章的学习笔记即是对Java核心技术课程的总结,也是对自己学习的总结 文章目录 Jav ...

最新文章

  1. 创建用于云支持的枢纽
  2. Establishing SSL connection without server's identity verification is not recommended.
  3. #3120. 「CTS2019 | CTSC2019」珍珠
  4. UnrealEngine4 学习总结备忘
  5. LibcarePlus用户态程序热补丁
  6. Python一些很实用的知识
  7. 机械硬盘低级格式化软件_万能硬盘低格工具(支持所有IDE、SATA、移动硬盘)
  8. 计算机图表公式,通达信的DRAWICON49个图标公式
  9. Hibernate官网下载最新版jar包
  10. P1843 奶牛晒衣服
  11. 查看linux系统显卡型号
  12. 前端面试题:HTML 语义化的理解
  13. Java初转型-Maven入门
  14. 计算机管理邮箱,用WindowsLiveMail一次管理多个邮箱
  15. 记录一下解决win10无法分屏问题
  16. POI锁定单元格的问题
  17. Matlab论文插图绘制模板第39期—阶梯图(Stairs)
  18. CAD图纸打印文字显示空心怎么办?
  19. chatgpt 镜像版
  20. IDEA的使用:4.IntelliJ IDEA的激活

热门文章

  1. cache:缓存在asp.net中如何管理?服务器端缓存?Session, Application, Cache objectscache ,客户端缓存?Cookies,ViewState...
  2. 零基础自学Java变成能成吗?前景如何
  3. mysql四:数据操作
  4. Java面试题集合(比较实用)
  5. Struts2中使用OGNL表达式投影(过滤)集合
  6. modbus-rtu qt4-serialport1------ xp as host
  7. .NET混淆器 Dotfuscator使用教程三:保护你的应用之检查受保护的程序集
  8. JBoss 系列五十:使用Apache httpd(mod_jk)和JBoss构架高可用集群环境
  9. 在 ASP.NET Core 中集成 Skywalking APM
  10. Unicode、UTF-8、Big Endian、Little Endian、GBK、UCS-2