private static final Long serialVersionUID= 1L详解
我们知道在对数据进行传输时,需要将其进行序列化,在Java中实现序列化的方式也很简单,可以直接通过实现Serializable接口。但是我们经常也会看到下面接这一行代码,
private static final Long serialVersionUID= 1L;
这段代码到底有什么用呢? 为什么有些代码写了它,有些代码没写?
一、案例代码1
首先我们看这一段代码
public class Person implements Serializable {private String name;private Integer age;public Person(){}public Person(String name, Integer age){this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}
public class IOTest {public static void main(String[] args) throws IOException, ClassNotFoundException {out();//in();}public static void out() throws IOException {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\Lenovo\\Desktop\\java练习\\src\\main\\resources\\Person.txt"));Person person = new Person("张三",18);oos.writeObject(person);oos.close();}public static void in() throws IOException, ClassNotFoundException {ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\Lenovo\\Desktop\\java练习\\src\\main\\resources\\Person.txt"));Object object = ois.readObject();System.out.println(object);}
}
执行该段代码,运行结果
然后将out();注释掉, 执行in();
如果这个时候我修改了Person类,增加sex成员变量
public class Person implements Serializable {private String name;private Integer age;private char sex;public Person(){}public Person(String name, Integer age, char sex) {this.name = name;this.age = age;this.sex = sex;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public Person(String name, Integer age){this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}
我在执行IOTest类中的in()方法(注释掉out();方法), ,发现会报错
这是为什么呢?为什么只是在Person类中增加了一个char sex成员变量, 执行in()方法就会报错.
二、案例代码2
如果在以上Person类中添加
private static final long serialVersionUID = 1L;
按照案例代码1中的执行顺序运行一遍代码,(先将Person.txt文件中的内容全部删除)
这是为什么呢?
三、案例代码1和案例代码2分析
这里先搞清楚java中的序列化和反序列化代表什么意思
序列化:把Java对象转换为字节序列的过程
方序列化:把字节序列恢复为Java对象的过程。
这里看一下案例代码1执行所产生的的错误:invalidClassException,然后我们再看下面一行serialVersionUID有两个不同的值,仔细分析,发现这两个不同的值才是产生异常的原因。
在案例1代码中我们在Person类中没有设置serialVersionUID值。我们首先执行的是out()方法,作用就是将person对象写入(序列化)到Person.txt文件中,而在序列化的过程中Person类也会产生一个serialVersionUID值,如果Person类中没有定义serialVersionUID值,则系统会自动生成一个值,就是第一个5428155211170925772,会存入到Person.txt文件中,然后我们在Person类中增加了一个sex成员变量,注释掉out()方法,执行in()方法,相当于一个反序列化的过程,这个时候会报错,是因为在Person类由于被增加了一个sex成员变量,导致系统生成的serialVersionUID改变了,变成了-1544469845932994986,而我们存入到Person.txt文件中的person对象的serialVersionUID却是5428155211170925772所以系统就判定这两个Person类不是同一个,就会导致invalidClassException异常。
案例2代码中我们规定了Person类中private static final long serialVersionUID = 1L的值,这就保证了无论Person类再怎么变,serialVersionUID都是一个固定的值,不再是系统生成的,这就能够避免Person类增加或者减少成员变量都不会导致serialVersionUID改变。
这是java源码中的一段话
如果可序列化类没有显式声明serialVersionUID,那么序列化运行时将根据类的各个方面计算该类的默认serialversion UID值,如Java对象序列化规范中所述。此规范将枚举类型的seriaVersionUID定义为0L。但是。强烈建议除枚举类型之外的所有可序列化类都显式声明serialVersionUID值,因为默认的
seriaverslon UID计算对类细节非常敏感,这些细节可能因编译器实现而有所不同。因此在反序列化过程中可能会导致意外的InvalidClassException。因此。为了保证不同java编译器实现中的serialVerslonUID值一致。可序列化类必须声明显式serialVersionUID值。此外。强烈建议显式serialVersionUID声明尽可能使用私有修饰符。因为此类声明仅适用于立即声明的类—serialVersionUID字段作为继承成员没有用处。数组类不能声明显式的serialversionUID,因此它们总是具有默认的计算值,但数组类不需要匹配serialVersion UID值。
相关文章:
private static final Long serialVersionUID= 1L详解
我们知道在对数据进行传输时,需要将其进行序列化,在Java中实现序列化的方式也很简单,可以直接通过实现Serializable接口。但是我们经常也会看到下面接这一行代码,private static final Long serialVersionUID 1L;这段代…...
若依前后端分离版集成nacos
根据公司要求,需要将项目集成到nacos中,当前项目是基于若依前后端分离版开发的,若依的版本为3.8.3,若依框架中整合的springBoot版本为2.5.14。Nacos核心提供两个功能:服务注册与发现,动态配置管理。 一、服…...
JAVA面试八股文一(mysql)
B-Tree和BTree区别共同点;一个节点可以有多个元素, 排好序的不同点:BTree叶子节点之间有指针,非叶子节点之间的数据都冗余了一份在叶子节点BTree是B-Tree 的升级mysql什么情况设置了索引,但无法使用a.没符合最左原则b.…...
动静态库概念及创建
注意在库中不能写main()函数。 复习gcc指令 预处理-E-> xx.i 编译 -S-> xx.s 汇编 -c-> xx.o 汇编得到的 xx.o称为目标可重定向二进制文件,此时的文件需要把第三方库链接进来才变成可执行程序。 gcc -o mymath main.c myadd.c mysub.c得到的mymath可以执…...
【H.264】码流解析 annexb vs avcc
H264码流解析及NALUAVCC和ANNEXB 前者是FLV容器、mp4 常用的。后者 是实时传输使用,所以是TS 一类的标准。VLC显示AVC1就是AVCC AVCC格式 也叫AVC1格式,MPEG-4格式,字节对齐,因此也叫Byte-Stream Format。用于mp4/flv/mkv, VideoToolbox。 – Annex-B格式 也叫MPEG-2 trans…...
【最优化方法】1-最优化方法介绍
文章目录1 最优化起源2 最优化发展3 运筹学在国外4 运筹学在国内5 什么是最优化?6 为什么要研究最优化问题?7 最优化问题8 最优化问题分类9 最优化研究内容理论算法应用1 最优化起源 中国古代优化思想–田忌赛马(公元前340年) 18世纪L.Euler࿰…...
数据结构 | 树 | 二叉树
🔥Go for it!🔥 📝个人主页:按键难防 📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 📖系列专栏:数据结构与算法 ὒ…...
笔记:使用 unbuild 搭建 JavaScript 构建系统笔记
使用 unbuild 搭建 JavaScript 构建系统jcLee95:https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 简介: 本文是笔者阅读分析 elementPlus 项目时记录的。该项目用到了一个完全没有文档和资料的工具 unbu…...
【SpringBoot3.0源码】启动流程源码解析 •下
文章目录初始化DefaultBootstrapContext开启Headless模式获取监听器并启动封装命令行参数准备环境打印Banner创建上下文容器预初始化上下文容器刷新Spring容器打印启动时间发布事件执行特定的run方法上一篇《【SpringBoot3.0源码】启动流程源码解析 • 上》,主要讲解…...
QT(56)-动态链接库-windows-导出变量-导出类
1.导出变量 1.1不使用_declspec(dllimport) _declspec(dllexport) 使用_declspec(dllimport) _declspec(dllexport) 1.2win32 mydllwin32 myexe 1.3win32 mydllqt myexe 2.导出类 使用_declspec(dllimport) _declspec(dllexport) 2.1不用关键…...
TCP传输文件
传输文件和传输信息的区别: 传输信息,只是一条数据,传输文件是多条数据传输信息传输过去一般都会显示,传输文件一般不会显示,一般只是存放在文件中传输文件需要传输,文件大小和文件名称(不然不知…...
vue3:加载本地图片等静态资源
背景 在我们用 vue2 webpack 的时候,加载图片资源是这样用的: <img :src"require(/assets/test.png)" />这样打包后就会触发 file-loader 打包图片资源,在 dist 文件夹中就可以看到这个图片(如果图片较小会打包…...
工作记录------数据库group_concat函数长度问题
工作记录------group_concat函数长度问题 背景:页面在数据展示时,报错,错误显示:String index out of range: -1 异常信息 java.lang.StringIndexOutOfBoundsException: String index out of range: -1at java.lang.String.sub…...
Python基础语法
1 编程环境 1.1 编译环境 pycharmpython/anaconda 1.2 环境设置 File -> settings -> Project interpreter -> 1.3 Hello world 2 条件判断 2.1 例题 【题1】输入一个年份,判断是否是闰年 ①能被4整除,但不能被100整除; ②能被400整…...
windows环境下安装Nginx及常用操作命令
windows环境下安装Nginx及常用操作命令nginx基本概述基本用途nginx安装nginx基本概述 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器。基本用途 nginx是一个轻量级高并发服务器,而tomcat并不是。nginx一般被用来做反向代理,将请求转发到应用…...
python excel数据处理?
前段时间做了个小项目,帮个海洋系的教授做了个数据处理的软件。基本的功能很简单,就是对Excel里面的一些数据进行过滤,统计,对多个表的内容进行合并等。之前没有处理Excel数据的经验,甚至于自己都很少用到Excel。记得《…...
Hudi-集成Flink
文章目录集成Flink环境准备sql-client方式启动sql-client插入数据查询数据更新数据流式插入code 方式环境准备代码类型映射核心参数设置去重参数并发参数压缩参数文件大小Hadoop参数内存优化读取方式流读(Streaming Query)增量读取(Increment…...
重新认识 React Hooks useContext
通常来说,React 数据的传递方式都是一层一层把资料 props 传到子层的 就算第二层(Function Component)、第三层(Button Group Compontn) 根本没有用到这个资料,但是为了传到最底层(button) ,每一层还是必须要传props // App.js const App = () => {const [dark, setDark…...
数据库(2)--加深对统计查询的理解,熟练使用聚合函数
一、内容要求 利用sql建立学生信息数据库,并定义以下基本表: 学生(学号,年龄,性别,系号) 课程(课号,课名,学分,学时) 选课࿰…...
stm32f407探索者开发板(十五)——NVIC中断优先级管理
文章目录零、前言一、NVIC中断优先级分组1.1 中断的管理方法1.2 抢占优先级&相应优先级的区别1.3 举例1.4 特别说明1.5 中断优先级分组函数二、NVIC中断优先级设置2.1 中断设置相关寄存器2.2 中断设置优先级2.2.1 中断优先级控制的寄存器组 IP[240]2.2.2 中断使能寄存器组 …...
【Azure 架构师学习笔记】-Azure Logic Apps(6)- Logic Apps调用ADF
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Logic Apps】系列。 接上文【Azure 架构师学习笔记】-Azure Logic Apps(5)- 标准和使用量类型的区别 前言 Logic Apps 和 ADF 的搭配使用是常见的组合,它们可以互相弥补各自的不足和…...
python随机获取列表中某一元素
1、利用Python中的random模块中的choice方法 random.choice()可以从任何序列,比如list列表中,选取一个随机的元素返回,可以用于字符串、列表、元组等。 import random arr[1,2,3,4,5,6] print(random.choice(arr))2、利用Python中的random模…...
Nacos微服务笔记
Nacos安装Nacos 的 Github(Tags alibaba/nacos GitHub)下载我们所需的 Nacos 版本,可以选择 windows 或者 Linux。 进入官网,选择合适版本,tar.gz为linux版本,zip为windows版本。下载并解压 nacos-server…...
MAC文件误删怎么办?mac数据恢复,亲测很好用的方法
电脑文件误删,应该很多人都经历过。之前分享了很多关于Windows电脑文件误删如何恢复的方法,那么MAC电脑文件误删该怎么办?有什么好方法可以使得mac数据恢复回来吗?下面就给大家分享一些亲测好用的方法! 一、MAC电脑的文…...
机械革命z2黑苹果改造计划第二番-MacOS实用软件渗透工具
机械革命z2黑苹果改造计划第二番-实用软件 Mac实用工具 这是旧电脑改造计划的第二篇,就是安装一些常用软件和一些渗透测试工具,武装灵魂成为真正的生产力工具 首先推荐一个网站,www.mactools.app,这个软件里边有大多数常用的软…...
【LeetCode】每日一题(4)
目录 题目:1124. 表现良好的最长时间段 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:1124. 表现良好的最长时间…...
Linux内核移植:内核的启动过程分析、启动配置与rootfs必要文件
Linux内核移植:内核的启动过程、启动配置与rootfs必要文件一、启动过程二、启动配置(一)SysV初始化(二)systemd初始化三、rootfs中的启动配置文件1、inittab2、/etc/init.d/rcS 脚本3、fstab4、profile 文件5、其他文件…...
【代码随想录训练营】【Day14】第六章|二叉树|理论基础|递归遍历|迭代遍历|统一迭代
理论基础 二叉树的定义形式有:节点指针和数组 在数组中,父节点的下标为i,那么其左孩子的下标即i*21,右孩子的下标即为i*22 二叉树的常见遍历形式有:前序遍历、后序遍历、中序遍历和层序遍历 前序遍历:二…...
AXI-Stream 学习笔记
参考 https://wuzhikai.blog.csdn.net/article/details/121326701 https://zhuanlan.zhihu.com/p/152283168 AXI4 介绍 AXI4 是ARM公司提出的一种片内总线,描述了主从设备之间的数据传输方式。主要有AXI4_LITE、AXI4_FULL、AXI4_STREAM三种。 AXI4_LITE࿱…...
【Linux】程序进程地址空间
文章目录程序地址空间进程地址空间程序地址空间 在Linux下,这种地址叫做 虚拟地址, 我们在用C/C语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理 问:C/C程序地址空间是内存吗? -> 根本就不是内存! 是进程虚拟地址空间 堆栈…...
最新网站域名/互联网项目推广
2019独角兽企业重金招聘Python工程师标准>>> jquery中的ajax方法参数,常用参数如下: $.ajax({type: "get",url: http://xxx.xxx.com/xxx/xxx/xxx/personId,dataType: "json",data:{id:personId},success: function(data)…...
北京高端网站建/徐州网站设计
jsp70708在线答疑系统 双数据库版 mysql该设计有演示视频 100%能运行买重包换 保密发送 一校一份编号:jsp70708语言数据库:jspsql2008mysql论文字数:12184字摘 要随着国民生活水平的逐渐提高,互联网的普及给人们带来的便…...
石排网站设计/网站seo推广
引言 在工作中引入Angular框架将近一年了,在这一年中不断的踩坑和填坑,当然也学习和积累了很多的知识,包括MVVM框架、前后端分离、前端工程化、SPA优化等等。因此想通过Angular开发实践这系列的文章分享下自己的所学,达到交流和分…...
网站建设的素材/网页制作素材模板
原 自己录制的Oracle 相关视频(陆续更新)https://blog.csdn.net/tianlesoftware/article/details/4886500版权声明: https://blog.csdn.net/tianlesoftware/article/details/4886500 1. Oracle 10g windows 平台下安装 下载地址: http://download.c…...
宁德做网站/电商sem是什么意思
我想检查是否有任何用户有权下载任何文件.我有产品ID和用户ID,如何检查?我在google和woocommerce文档中进行了很多探索,但未找到任何解决方案.有什么帮助吗?提前致谢.解决方法:这是获取此信息的过程,您可以在php文件中的任何函数或挂钩函数中使用该信息.…...
阿里云做视频网站可以吗/湖南企业seo优化推荐
2019独角兽企业重金招聘Python工程师标准>>> 参考:http://happylab.blog.51cto.com/1730296/1736562/ 1. 概述 openstack的cinder项目负责volume的服务,即虚拟机的外挂存储,cinder作为管理存储的工具,可以支持LVM&…...