java 中的 serialVersionUID
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相关推荐
- 为什么要在Java的Serializable类中使用SerialVersionUID
序列化和SerialVersionUID始终是许多Java开发人员的难题. 我经常会看到类似此SerialVersionUID的问题,或者如果不在我的Serializable类中声明SerialVer ...
- java中序列化的serialVersionUID解释
serialVersionUID: 字面意思上是序列化的版本号,这个在刚刚接触java编程时,学序列化大家一般都不会注意到,在你一个类序列化后除非你强制去掉了myeclipse中warning的功能, ...
- Java中ArrayList源码分析
一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...
- java培训教程分享:Java中怎样将数据对象序列化和反序列化?
本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...
- java中的各种流(老师的有道云笔记)
内存操作流-字节 之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操作流.此时得使用内存流完成内存的输入和输出操作. 如果程序运行过程中要产生一些临时文件,可采用虚拟文 ...
- 在Java中实现单例模式的有效方法是什么? [关闭]
在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...
- Java 中序列化与反序列化
一. 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.将程序中的对象,放入文 ...
- 如何获得Java中泛型类的类型参数?
获得泛型类的形式参数 Java中提供了Class接口用于描述类的运行时信息.此外,还提供了Type接口用于描述类的类型信息.Type接口有多个子类,包括Class.TypeVariable.Par ...
- java中怎么固定间距_java中的GridBagLayout是怎么调组件间距的...
展开全部 java中的GridBagLayout调组件间距使用百分比来调,实例如下:package JavaGUI; import java.awt.EventQueue; import java.a ...
最新文章
- 3.3 集束搜索-深度学习第五课《序列模型》-Stanford吴恩达教授
- 【工作总结】银行应用系统架构(二)
- 【数据库题型大总结】应用题总结
- kernel开启启动log_systemd service 如何开启 core dump
- erp系统是什么软件有哪些
- ThinkPHP 3.2.3 自动加载公共函数文件的方法
- 2017全球光伏增速或放缓 国内“6·30”仍将是分水岭
- C++的性能C#的产能?! - .Net Native 系列向导
- 一、matpower安装流程
- PandoraBox潘多拉无线桥接(中继)使用方法和无法使用解决----小米mini小米3路由
- win8删除计算机管理员权限,win8.1系统如何删除administrator账户
- Copy Elision
- Word文件打开之后有只读限制
- html5调用腾讯视频,小程序h5获取腾讯视频的真实mp4地址video!【前端+后端方法】...
- 如何查看IE浏览器版本?在线检测IE版本号
- 【FXCG】传奇人物保罗•都铎•琼斯(二)
- WEB端和手机端-三种提示框架
- if lte IE if gte IE 浏览器兼容
- 正向动力学与反向动力学
- Bootstrap重抽样方法
热门文章
- H3C Boot升级 Serial模式
- Arduino教程资料汇总(8月22日悄悄跟新了一下)
- android Toast大全(五种情形)建立属于你自己的Toast
- Android 动画之View动画效果和Activity切换动画效果
- 开源 免费 java CMS - FreeCMS1.5 标签 guestbookPage
- 在PHP中实现StringBuilder类
- 使用Nagios监控网页
- java args例子_Spring AOP中使用args表达式的方法示例
- mysql 表空间监控shell_一种通过zabbix监控mysql表空间的方法
- 安装oracle到create inventory时卡住了怎么办_「推荐」wacom数位板怎么用?教你如何正确的安装数位板驱动...