serialVersionUID简要介绍

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

序列化是一种把对象持久化到外部的手段。在网络传输等场景中应用广泛,如Dubbo等框架。类通过实现 java.io.Serializable 接口以启用其序列化功能。

阿里Java规约中的描述

阿里规约中强制性的提醒,修改serialVersionUID字段,会引起反序列化失败的情况。

代码演示

下面,通过实际代码,来演示对象序列化、反序列化的操作。

引入依赖

org.apache.commons commons-lang3 3.8.1commons-io commons-io 2.6junit junit 4.12

commons-lang3这个包有帮我们实现了序列化的工具类,commons-io帮我们实现了文件操作的工具类,junit用来写单元测试。

序列化

有User.class如下:

@Data@Builderpublic class User implements Serializable {​ private static final long serialVersionUID = 1L;​ private String username;​}

@Data 和 @Builder 是Lombok里面的注解,可以自动生成getter、setter方法等,不懂的可以查看我之前的文章,对这个有讲解。

需要序列化的类,需要实现Serializable接口,Serializable是一个标识接口,里面没有具体需要实现的东西。

序列化代码:

@Testpublic void serializeTest() throws IOException { User user = User.builder().username("happyjava").build(); byte[] serialize = SerializationUtils.serialize(user); FileUtils.writeByteArrayToFile(new File("serialize.txt"), serialize);}

SerializationUtils是commons-lang3包给我们提供的工具类,它给我们提供了序列化和反序列化的方法,我们直接拿过来用就好了。

FileUtils是commons-io包给我们提供的工具类,它给我们提供了非常丰富的IO操作工具类。

执行方法后,查看serialize.txt:

这就是序列化后,保存到外部的对象了。我们可以把它反序列化成为对象。

反序列化

反序列化代码如下:

@Testpublic void deserializeTest() throws IOException { byte[] bytes = FileUtils.readFileToByteArray(new File("serialize.txt")); Object object = SerializationUtils.deserialize(bytes); System.out.println(object instanceof User); User user = (User)object; System.out.println(user.getUsername());}

这里使用FileUtils把外部的文件读入,使用SerializationUtils反序列化成为对象。然后判断反序列化后对象的类型,强转为User后输出其username,运行结果如下:

说明反序列化已经成功过了

修改serialVersionUID值,使反序列化异常

现在把User的serialVersionUID值做一下修改:

@Data@Builderpublic class User implements Serializable {​ private static final long serialVersionUID = 2L;​ private String username;​}

之前是1,现在改为2,再次执行反序列化方法,结果如下:

这里出现了开头提到的InvalidClassException异常,并且通过异常信息可以看到,这是serialVersionUID不一致引起的。

org.apache.commons.lang3.SerializationException: java.io.InvalidClassException: cn.happy.User; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2

总结

通过理论和代码演示,我们已经知道了serialVersionUID字段可以造成反序列化失败的情况。所以在做系统升级的时候,需要充分考虑是否要改动serialVersionUID的值,因为这会引起兼容性的问题。

serialversionuid的作用_为什么阿里Java规约要求谨慎修改serialVersionUID字段相关推荐

  1. 为什么阿里Java规约要求谨慎使用SimpleDateFormat

    前言 在阿里Java开发规约中,有强制性的提到SimpleDateFormat 是线程不安全的类 ,在使用的时候应当注意线程安全问题,如下: 其实之前已经介绍过使用JDK1.8的DateTimeFor ...

  2. java代码内创建mysql索引_点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)...

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:MySQL数据库 (建表规约.索引规约.SQL语句.ORM映 ...

  3. 为什么阿里Java规约禁止使用Java内置Executors创建线程池?

    IDEA导入阿里规约插件,当你这样写代码时,插件就会自动监测出来,并给你红线提醒. 告诉你手动创建线程池,效果会更好. 在探秘原因之前我们要先了解一下线程池 ThreadPoolExecutor 都有 ...

  4. 什么是抽象类?抽象类的作用_揭秘!Java 泛型背后到底是什么?

    作者:的一幕 链接:www.jianshu.com/p/dd34211f2565 这一节主要讲的内容是java中泛型的应用,通过该篇让大家更好地理解泛型,以及面试中经常说的泛型类型擦除是什么概念,今天 ...

  5. java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用

    深入理解Java中的引用(二)--强软弱虚引用 在上一篇文章中介绍了Java的Reference类,本篇文章介绍他的四个子类:强引用.软引用.弱引用.虚引用. 强引用(StrongReference) ...

  6. java 字节数组作用_这段java代码中字节数组b起到了什么作用?

    importjava.io.*;importjavax.swing.*;publicclassIOMonitor{publicstaticvoidmain(String[]temp){//TODO自动 ...

  7. Java中xmp标签的作用_如何在Java中从JPEG读取XMP面部数据

    我已经将Picasa的面部数据保存在JPEG文件中(在XMP中),现在我试图用Java读取该信息.到目前为止,我失败了,将不胜感激. 我正在尝试使用metadata-extractor库(尽管任何其他 ...

  8. java string的作用_浅谈java String不可变的好处

    一.java内部String类的实现: java 8: public final class String implements java.io.Serializable, Comparable, C ...

  9. java 监听器作用_浅谈java监听器的作用

    监听器是JAVA Web开发中很重要的内容,其中涉及到的知识,可以参考下面导图: Web监听器 1 什么是web监听器? web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特 ...

最新文章

  1. MyBatis 为什么需要通用 Mapper ?
  2. debian 下配置common lisp环境
  3. 【php】目录操作 文件操作
  4. SQL 语法参考手册
  5. rsync 配置详解
  6. ppt变成了图片不能编辑文字怎么办_谁说水印一定要去掉?用到PPT里贼好看好吗!...
  7. 如何在Eclipse 3.3上安装jadclipse[java的反编译工具] 收藏
  8. 2022春节档电影票房破20亿元
  9. Zmodem协议由浅入深
  10. 服务器默认用户名密码
  11. Python批量转换png图片为ico
  12. 虚拟机Windows10下载安装保姆级教程
  13. 计算机上数字代表那个音符,音乐简谱中数字上的点表示什么,别说你不知道哦 ^-^...
  14. sentencePiece入门小结
  15. 使用SPACEDESK时iPad显示Connected-Display OFF解决方法
  16. LED发光二极管限流电阻的计算
  17. 简述结构化范型和面向对象范型的要点,并分析它们的优缺点。
  18. oracle 建索引 00054,ora-00054 表被lock导致资源忙等待不能操作案例
  19. zip解压文件 删除文件和文件目录
  20. CS信号(片选信号)经常都是低电平有效

热门文章

  1. 【转】wordpress/wp-includes目录文件概述
  2. 12.8 早晨我一直在假笑,为了骗自己
  3. iOS 支付宝SDK接入详解
  4. 【bitset 技巧 分块】bzoj5087: polycomp
  5. 秒杀核心设计(减库存部分)-防超卖与高并发
  6. [树形dp] Jzoj P1046 寻宝之旅
  7. Tensorflow学习教程------tfrecords数据格式生成与读取
  8. Deep Learning(深度学习)学习笔记整理系列三
  9. 利用微软平台生成报表,线性图,柱形图
  10. C#复制文件到指定文件夹