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

serialVersionUID简要介绍

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

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

阿里Java规约中的描述

a386363205d08c128b9d50db69f28dc9.png

阿里规约中强制性的提醒,修改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是一个标识接口,里面没有具体需要实现的东西。

f45e2f39827be3bd5d4bedc8e274b355.png

序列化代码:

@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:

0f2710a361c7b76c1d9580fe4a3bbe60.png

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

反序列化

反序列化代码如下:

@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,运行结果如下:

c0bb5764a8f0c785d8c9b6897a5cc2d7.png

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

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

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

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

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

515fe6767c32fb127f296dbc04ec0f8f.png

这里出现了开头提到的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的值,因为这会引起兼容性的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fatal error LNK1169: 找到一个或多个多重定义的符号 的解决方案

昨天&#xff0c;尝试一个项目&#xff0c;遇到了如下的问题。先来还原一下&#xff1a; 头文件test.h #pragma once #include <Eigen/Core> #include <iostream>using namespace Eigen; using namespace std;class point2 { public: point2(int x1,int y1):x(x…

常用工具说明--搭建基于rietveld的CodeReview平台(未测试)

为什么要codereview . 整个团队的编码风格是统一的。 . 有高手能对自己的代码指点一二&#xff0c;从而提高编码水平。 . 减少低级错误的出现 . 约束自己写高质量的代码&#xff0c;因为是要给人看的。 我们对codereview的需求 . 很轻松可以发布自己写的代码。 . 很轻松的可以与…

输入的优化

读入整型时&#xff0c;输入优化可以节省不少时间 1 typedef type long long 2 // 这里以long long为例 3 type read() { 4 type x0; int f1; 5 char chgetchar(); 6 while(ch<0||ch>9) {if(ch-) f-1; chgetchar();} 7 while(ch>0&&ch<9) …

python股票分析系统_熬了一晚上,小白用Python写了一个股票提醒系统

码农小马七夕节去相亲了&#xff0c;见了一个不错的姑娘&#xff0c;长的非常甜美&#xff01;聊着聊着很投缘&#xff01;通过介绍人了解到&#xff0c;对方也很满意&#xff5e;&#xff5e;想着自己单身多年的生活就要结束啦&#xff0c;心里满是欢喜&#xff0c;美美哒&…

有关eigen库的一些基本使用方法

目录 介绍安装Demo矩阵、向量初始化C数组和矩阵转换矩阵基础操作点积和叉积转置、伴随、行列式、逆矩阵计算特征值和特征向量解线性方程最小二乘求解稀疏矩阵介绍 Eigen是一个轻量级的矩阵库,除了稀疏矩阵不成熟&#xff08;3.1有较大改进&#xff09;以外,其他的矩阵和向量操作…

汇编程序:将字符串中所有大写字符转为小写

【任务】 编写程序&#xff0c;将数据区中定义的以0作为结束符的一个字符串中所有的大写字符&#xff0c;全部转换为小写。 【参考解答】 assume cs:cseg, ds:dseg, ss:sseg sseg segment stackdw 100h dup (?) sseg ends dseg segmentdb YanTai123University, 0 d…

从零开始编写自己的C#框架(1)——前言

记得十五年前自学编程时&#xff0c;拿着C语言厚厚的书&#xff0c;想要上机都不知道要用什么编译器来执行书中的例子。十二年前在大学自学ASP时&#xff0c;由于身边没有一位同学和朋友学习这种语言&#xff0c;也只能整天混在图收馆里拼命的啃书。而再后来也差不多&#xff0…

Bash内置命令

Bash有很多内置命令&#xff0c;因为这些命令是内置的&#xff0c;因此bash不需要在磁盘上为它们定位&#xff0c;执行速度更快。 1&#xff09;列出所有内置命令列表$enable 2&#xff09;关闭内置命令test$enable -n test 3&#xff09;打开内置命令test$enable test 4&…

postman调用webservice接口_接口对前后端和测试的意义

1.什么是接口&#xff1f;接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点&#xff0c;定义特定的交互点&#xff0c;然后通过这些交互点来&#xff0c;通过一些特殊的规则也就是协议&#xff0c;来进行数据之间的交互。2.接口都有哪些类型&#xff1f;接口…

基于代数距离的椭圆拟合

问题 给定离散点集Xi(xi,yi),i1,2,...NX_i(x_i,y_i) ,i1,2,...NXi​(xi​,yi​),i1,2,...N&#xff0c;我们希望找到误差最小的椭圆去拟合这些离散点。 方法 由于椭圆的形式可以给定&#xff0c; 自然我们将使用最小二乘法来求解椭圆。主要依据论文《Direct least squares f…

Java与C语言比较(Java参考书中摘录)

C语言为面向过程的编程语言&#xff0c;Java为面向对象的编程语言。 在面向过程的编程语言(如C语言)中&#xff0c;编程一般面向操作&#xff0c;编程单位是函数(在Java中函数称为方法)。 在Java中&#xff0c;编程单位是类。最终实例化(即创建)这些类而得到对象&#xff0c;属…

Android调试技巧之Eclipse行号和Logcat

很多初入Android的开发者可能会发现经常遇到Force Close或ANR这样的问题&#xff0c;一般我们通过Android系统的错误日志打印工具Logcat可以看到出错的内容&#xff0c;今天一起来说下如何通过 Eclipse行号和Logcat捕捉出错点&#xff0c;我们遇到错误可以首先在Eclipse的DDMS中…

第六章 产权市场

《市场经济概论》&#xff08;6&#xff09;产权市场一 第六章 产权市场 产权是指人们对于某种资产所拥有的所有权、占有权、支配权、使用权。产权市场是指人们对于某种资产所拥有的所有权、占有权、支配权、使用权进行有偿转让的场所领域及其有关各方面相互关系的总和。在过去…

js打开本地文件夹_vue + ArcGIS 地图应用系列一:arcgis api本地部署(开发环境)

1. 下载 ArcGIS API for JavaScript 官网地址&#xff1a; https://developers.arcgis.com/javascript/3/ 下载地址&#xff1a;http://links.esri.com/javascript-api/latest-download需要稳定的网络环境注册账号后才可以下载下载完成后解压文件&#xff0c;文件比较大可能需要…

基于几何距离的椭圆拟合

问题 给定离散点集Xi(xi,yi)X_i(x_i,y_i)Xi​(xi​,yi​)&#xff0c;我们希望找到最好的椭圆去拟合这些离散点。 方法 通常我们使用最小二乘法求解如下的最优化问题&#xff1a; Min∑i1Nf(xi,E)2Min \sum_{i1}^N f(x_i,E)^2 Mini1∑N​f(xi​,E)2 这里f(xi,E)f(x_i,E)f(xi…

Generate Parentheses

题目 Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 方法…

ReportViewer 2010 打印预览,用鼠标快速切换显示比例时报错:存储空间不足,不能处理此命令...

CreateCompatibleDIB 存储空间不足 无法处理此命令 安装 ReportViewer 2010 sp1 即可。转载于:https://www.cnblogs.com/runliuv/p/3640856.html

贪心/二分查找 BestCoder Round #43 1002 pog loves szh II

题目传送门 1 /*2 贪心/二分查找&#xff1a;首先对ai%p&#xff0c;然后sort&#xff0c;这样的话就有序能使用二分查找。贪心的思想是每次找到一个aj使得和为p-1(如果有的话)3 当然有可能两个数和超过p&#xff0c;那么an的值最优&#xff0c;每次还要和…

nohup命令输出日志_逼格高又实用的Linux高级命令,开发运维都要懂

在运维的坑里摸爬滚打好几年了&#xff0c;我还记得我刚开始的时候&#xff0c;我只会使用一些简单的命令&#xff0c;写脚本的时候&#xff0c;也是要多简单有多简单&#xff0c;所以有时候写出来的脚本又长又臭&#xff0c;像一些高级点的命令&#xff0c;比如说Xargs 命令、…

JavaScript中OOP——面向对象中的继承/闭包

前 言 OOP JavaScript中OOP——>>>面向对象中的继承/闭包 1.1面向对象的概念 使用一个子类继承另一个父类&#xff0c;子类可以自动拥有父类的属性和方法。>>> 继承的两方&#xff0c;发生在两个类之间。1.2JS模拟实现继承的三种方式&#xff1a; 首先&am…