2019独角兽企业重金招聘Python工程师标准>>>

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

具体的序列化过程是这样的

  • 序列化操作的时候系统会把当前类的serialVersionUID写入到序列化文件中,
  • 当反序列化时系统会去检测文件中的serialVersionUID,判断它是否与当前类的serialVersionUID一致,
    • 如果一致就说明序列化类的版本与当前类版本是一样的,可以反序列化成功,否则失败。

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

  • 一是默认的1L,比如:private static final long serialVersionUID = 1L;
  • 二是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段
  • 当实现java.io.Serializable接口的类没有显式地定义一个serialVersionUID变量时候,
    • Java序列化机制会根据编译的Class自动生成一个serialVersionUID作序列化版本比较用,
    • 这种情况下,如果Class文件(类名,方法明等)没有发生变化(增加空格,换行,增加注释等等),
      • 就算再编译多次,serialVersionUID也不会变化的。

情况一:假设Person类序列化之后,从A端传输到B端,然后在B端进行反序列化。

  • 在序列化Person和反序列化Person的时候,

    • A端和B端都需要存在一个相同的类。
  • 如果两处的serialVersionUID不一致,会产生什么错误呢?
    • Exception in thread "main" java.io.InvalidClassException: com.sf.code.serial.Person; local class incompatible: stream classdesc serialVersionUID = 1234567890, local class serialVersionUID = 123456789at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:621)at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)at com.sf.code.serial.DeserialTest.main(DeserialTest.java:13)

情况二:假设两处serialVersionUID一致,

  • 如果A端增加一个字段,然后序列化,而B端不变,然后反序列化,会是什么情况呢?

    • 最后的结果为:执行序列化,反序列化正常,但是A端增加的字段丢失(被B端忽略)。

情况三:假设两处serialVersionUID一致,如果B端减少一个字段,A端不变,会是什么情况呢?

  • 【答案】序列化,反序列化正常,B端字段少于A端,A端多的字段值丢失(被B端忽略)。

情况四:假设两处serialVersionUID一致,如果B端增加一个字段,A端不变,会是什么情况呢?

  • 说明序列化,反序列化正常,B端新增加的int字段被赋予了默认值0。

静态变量序列化

  • 原因在于序列化时,并不保存静态变量
  • 这其实比较容易理解,序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量。

转载于:https://my.oschina.net/u/3847203/blog/3010053

java 中的 serialVersionUID相关推荐

  1. 为什么要在Java的Serializable类中使用SerialVersionUID

    序列化和SerialVersionUID始终是许多Java开发人员的难题. 我经常会看到类似此SerialVersionUID的问题,或者如果不在我的Serializable类中声明SerialVer ...

  2. java中序列化的serialVersionUID解释

    serialVersionUID: 字面意思上是序列化的版本号,这个在刚刚接触java编程时,学序列化大家一般都不会注意到,在你一个类序列化后除非你强制去掉了myeclipse中warning的功能, ...

  3. Java中ArrayList源码分析

    一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...

  4. java培训教程分享:Java中怎样将数据对象序列化和反序列化?

    本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...

  5. java中的各种流(老师的有道云笔记)

    内存操作流-字节 之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操作流.此时得使用内存流完成内存的输入和输出操作. 如果程序运行过程中要产生一些临时文件,可采用虚拟文 ...

  6. 在Java中实现单例模式的有效方法是什么? [关闭]

    在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...

  7. Java 中序列化与反序列化

    一. 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.将程序中的对象,放入文 ...

  8. 如何获得Java中泛型类的类型参数?

    获得泛型类的形式参数   Java中提供了Class接口用于描述类的运行时信息.此外,还提供了Type接口用于描述类的类型信息.Type接口有多个子类,包括Class.TypeVariable.Par ...

  9. java中怎么固定间距_java中的GridBagLayout是怎么调组件间距的...

    展开全部 java中的GridBagLayout调组件间距使用百分比来调,实例如下:package JavaGUI; import java.awt.EventQueue; import java.a ...

最新文章

  1. 3.3 集束搜索-深度学习第五课《序列模型》-Stanford吴恩达教授
  2. 【工作总结】银行应用系统架构(二)
  3. 【数据库题型大总结】应用题总结
  4. kernel开启启动log_systemd service 如何开启 core dump
  5. erp系统是什么软件有哪些
  6. ThinkPHP 3.2.3 自动加载公共函数文件的方法
  7. 2017全球光伏增速或放缓 国内“6·30”仍将是分水岭
  8. C++的性能C#的产能?! - .Net Native 系列向导
  9. 一、matpower安装流程
  10. PandoraBox潘多拉无线桥接(中继)使用方法和无法使用解决----小米mini小米3路由
  11. win8删除计算机管理员权限,win8.1系统如何删除administrator账户
  12. Copy Elision
  13. Word文件打开之后有只读限制
  14. html5调用腾讯视频,小程序h5获取腾讯视频的真实mp4地址video!【前端+后端方法】...
  15. 如何查看IE浏览器版本?在线检测IE版本号
  16. 【FXCG】传奇人物保罗•都铎•琼斯(二)
  17. WEB端和手机端-三种提示框架
  18. if lte IE if gte IE 浏览器兼容
  19. 正向动力学与反向动力学
  20. Bootstrap重抽样方法

热门文章

  1. H3C Boot升级 Serial模式
  2. Arduino教程资料汇总(8月22日悄悄跟新了一下)
  3. android Toast大全(五种情形)建立属于你自己的Toast
  4. Android 动画之View动画效果和Activity切换动画效果
  5. 开源 免费 java CMS - FreeCMS1.5 标签 guestbookPage
  6. 在PHP中实现StringBuilder类
  7. 使用Nagios监控网页
  8. java args例子_Spring AOP中使用args表达式的方法示例
  9. mysql 表空间监控shell_一种通过zabbix监控mysql表空间的方法
  10. 安装oracle到create inventory时卡住了怎么办_「推荐」wacom数位板怎么用?教你如何正确的安装数位板驱动...