JAVA的序列化

article/2025/9/14 3:45:47

絮叨

Java序列化其实这个用的多不多,我觉得看公司的技术栈吧,如果用的是cloud那套,估计接触的会少点,但是也不是说没有,如果是dubbo那套的话,就多点,上次我们说Netty的编码解码的时候说到了谷歌的protoBuf,今天的话我们就来好好看看Java序列化,详细的聊聊

一、认识序列化

从网络通信认识序列化

从上面这张图我们可以看到,两个进程进行通信时候,想要发送数据,要先要把数据发送到TCP缓冲区,然后形成报文再发送出去,同样的道理,接收端也是一样。我们可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。同样的,当两个Java进程进行通信时,也可以使用序列化技术实现对象之间的传递。一句话:Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程

序列化的使用场景

这个使用场景应该算是最重要的一环了,因为我们学习序列化就是为了使用他,现在把他们归纳一下:

  • 永久性保存对象,保存对的字节序列到本地文件或者数据库中;
  • 通过序列化以字节流的形式对象在网络中进行传递和接收;
  • 通过序列化在进程间传递对象

序列化有什么好处呢?

  • 实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上
  • 利用序列化实现远程通信,即在网络上传送对象的字节序列。

java序列化机制

java序列化主要有两个接口,这两个接口的实现方式,我都会给出,但是重点在于serialize接口的实现方式。在这一部分中,先给出序列化基本的代码实现,在下一部分当中再来看序列化有哪些需要注意的问题。OK,现在开始代码实现java的序列化机制。

使用Serializable接口实现序列化(重点,要牢记,第三部分会多次使用)

首先我们定义一个对象类User

接下来,在Test类中去实现序列化和反序列化。

当我们运行序列化方法时候,就可以看到,我们把数据存在了G://Test/template。

同时当我们运行反序列化方法的时候,就可以看到,反序列化成功,结果就不贴出来了,比较简单。

使用Externalizable接口实现序列化

然后就是Test1类,和上面的Test一样,就不再贴出来了。在这里主要看Externalizable和Serializable接口的区别。下面对其进行归纳一下。

  • Externalizable继承自Serializable接口
  • 需要我们重写writeExternal()与readExternal()方法
  • 实现Externalizable接口的类必须要提供一个public的无参的构造器。

到这,java序列化机制的基本使用就讲完了,从上面可以看出,使用起来还是非常简单的。不过,仅仅会基本的使用还不行,想要面试的时候更加的装13,还需要进一步深化。因此下面一部分主要就是对序列化机制的深入分析。还需要说一点,对于Serializable接口实现的序列化方式一定要牢记,因为下面要多次使用

深入分析java序列化机制

serialVersionUID的作用

一句话:其目的是序列化对象版本控制,有关各版本反序列化时是否兼容。如果在新版本中这个值修改了,新版本就不兼容旧版本,反序列化时会抛出InvalidClassException异常。如果修改较小,比如仅仅是增加了一个属性,我们希望向下兼容,老版本的数据都能保留,那就不用修改;如果我们删除了一个属性,或者更改了类的继承关系,必然不兼容旧数据,这时就应该手动更新版本号,即SerialVersionUid。

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

  • 一是默认的1L,比如:private static final long serialVersionUID = 1L;
  • 二是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,

首先我们在User里面设置一下serialVersionUID=123456L。

接着我们更改serialVersionUID = 123456789L。然后再反序列化,就可以看到如下的错误了。同时也验证了序列化和反序列化需要版本一致的问题。

静态变量的序列化

首先需要说一下,静态变量不会被序列化。因为静态变量在全局区,本来流里面就没有写入静态变量,我打印静态变量当然会去全局区查找,当我write read 同时使用时,内存中的静态变量变了。

下面这个例子,主要是在对静态变量序列化之后,然后更改静态变量age的值,再重新反序列化输出一下。结果会出现两种情况:

  • (1)反序列输出的静态变量值没有变化:说明静态变量被序列化了。

  • (2)反序列输出的静态变量值变化了:说明静态变量没有被序列化了。

然后看一下输出结果

Transient 关键字作用

Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

这个很好理解也很简单。下面代码来看一下他的作用

  • 第一步:把User里面的年龄属性改成Transient 修饰。private transient int age;

  • 第二步:Test不变,进行序列化和反序列化。

  • 第三步:看结果。反序列化之后的输出age应该为0;


http://chatgpt.dhexx.cn/article/n23SflWs.shtml

相关文章

MySQL卸载重新安装会遇到的问题及解决方式

好家伙,全踩雷了: 一.使用cd命令无法进入到其他盘符? 解决:在cd后加/d,两者之间用空格隔开 二.初始化时没有给出密码? 解决:仔细检查my.ini配置文件中的配置命令,一般是配置命令写错…

如何将MySQL卸载干净?

前言 前几天不知道什么情况电脑被莫名下载了MySQL8.0版本导致与本机的MySQL5.0版本冲突,导致MySQL无法正常运行,后来因为没有卸载干净MySQL导致一直下载不成功,导致我晚上失眠,现在让我们进入正题,看看如何将他卸载干…

【通关MySQL】Win11如何将MySQL卸载干净?

✨哈喽,进来的小伙伴们,你们好耶!✨ 🚀🚀系列专栏:【通关MySQL】 ✈️✈️本篇内容: MySQL如何卸载干净? ⛵⛵作者简介:一名双非本科大三在读的科班Java编程小白,道阻且长&#xff…

如何能将mysql卸载干净

本篇文章介绍一下如何干净卸载mysql。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 第七步出现找不到相应的文件夹。第七步:路径是C:\Users\你的用户名字\AppData\Roaming\MySQL 有可能是隐藏的,需要显示隐藏…

如何将mysql卸载干净

一、在控制面板中卸载mysql软件 二、卸载过后删除C:\Program Files (x86)\MySQL该目录下剩余了所有文件,把mysql文件夹也删了 三、windowsR运行“regedit”文件,打开注册表 四、删除注册表:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Service…

MySQL卸载安装

目录 MySQL卸载安装 1. MySQL卸载(8.0版本) 1.1停止MySQL服务 1.2 卸载MySQL相关组件 1.3删除MySQL安装目录 1.4删除MySQL数据目录 1.5 删除MySQL注册表信息(重要) 2. MySQL安装(5.7.24版本) 2.1安装…

mysql卸载不_mysql卸载不干净解决方法

一、在控制面板中卸载mysql软件,此时mysql没有卸载干净。 二、卸载过后删除C:Program Files (x86)MySQL该目录下剩余了所有文件,把mysql文件夹也删了 三、windowsR运行“regedit”文件,打开注册表 四、删除注册表:HKEY_LOCAL_MACH…

MySQL的卸载与安装(附管理工具Navicat SQLyog)

本文MySQL为5.1.51版本,附全文所需文件压缩包(百度云 提取码:8778),其中SQLyog和Navicat为MySQL的图形化工具,任选其一安装即可(建议Navicat) 1.MySQL卸载 如果之前没有安装过MySQ…

【 Windows、Mac 】Mysql 卸载、安装

文章目录 Windows Mysql 卸载、安装一、彻底卸载mysql二、安装mysql 5.7三、安装 mysql 8四、MySql服务开机自启动失败 Mac 安装 mysql一、下载对应mysql版本二、安装三、重置密码 Windows Mysql 卸载、安装 一、彻底卸载mysql 1、关闭 MySql 服务。 2、在控制面板卸载mysq…

MySQL卸载、安装与使用

一、MySQL卸载 1.关闭服务 点击win,输入服务,找到MySQL的服务,右击停止该服务 2.删除服务 点击win,输入cmd,选择管理员身份运行。打开cmd,输入sc delete mysql 3删除配置的MySQL环境变量 MySQLHOME和…

MySQL卸载不干净问题

解决MySQL卸载不干净或安装的时候安装不成功,输入密码一直检查不通过问题 MySQL卸载不干净,之后安装就会遇到很多问题,我也遇到了这种情况,裝了好久,一到这里就会有问题,尝试卸载了很多次然后在从新裝&…

mysql卸载详细教程

完整卸载MySQL数据库 1、关掉mysql服务 直接搜索服务或者右键“我的电脑”,选择“管理”,打开计算机管理,选择“服务”右键MySQL服务,选择“停止” 2、 卸载mysql程序 开始菜单->控制面板->程序和功能 3、 删除计算机上…

免装版mysql卸载

免装版mysql卸载: 1.停止mysql服务:以管理员身份打开cmd执行:net stop mysql 2.删除Mysql的注册表 winr 输入regedit打开注册表: 3.管理员cmd执行:mysqld -remove mysql 4.删除mysql之前的安装包:

MySQL卸载与安装

目录 1.MySQL卸载2.MySQL安装2.1获取mysql.zip2.1.1百度网盘链接2.1.2官网获取 2.2解压到自己想要安装的目录2.3初始化 MySQL2.4安装 MySQL 服务2.5修改登录密码2.6配置环境变量2.7其他问题2.7.1重置 MySQL 系统2.7.2忘记密码2.7.3版本切换2.7.4编码和 my.ini 设置2.7.5修改密码…

MySQL卸载

文章目录 将现有MySQL服务关闭(必做)确定自己MySQL的安装位置(辅助工作)方法1:适用于之前成功安装MySQL并完成环境变量配置的情况方法2:暴力搜索-适用于之前修改过安装位置的情况 在系统中卸载MySQL&#x…

mysql的卸载与安装(超详细)

1、卸载 1、首先,停止window的MySQL服务,【windows键R 】打开运行框,输入【services.msc】打开(或者找到“控制面板”-> “管理工具”-> “服务”,停止MySQL后台服务)服务管理器,停止MyS…

Windows10 彻底卸载 MySQL

如果要重新安装MySQL就必须将之前的MySQL进行彻底的卸载,本文将详细地介绍如何彻底卸载Windows10里的MySQL。 第一步:关闭MySQL服务器,MySQL服务器的关闭有两种方式。 方法一:在管理员终端命令里输入: net stop mys…

Java List转String数组与String数组转List

1. String数组转List String title "\t 10月上旬\t 10月中旬\t 10月下旬"; String[] arrTitles title.split("\t"); List<String> titleList Arrays.asList(arrTitles);1.1 方法一&#xff08;不推荐&#xff09; List<String> titleLis…

list转Array

集合转数组 必须使用集合的 toArray(T[] array)&#xff0c;传入的是类型完全 一样的数组&#xff0c;大小就是 list.size()。 说明&#xff1a; 使用 toArray 带参方法&#xff0c;入参分配的数组空间不够大时&#xff0c;toArray 方法内部将重新分配内存空间&#xff0c;并…

List转int类型数组

在刷题过程中&#xff0c;想把一个List<Integer>类型的列表list转换成int []数组类型。发现直接调用list.toArray()相关方法会报异常不匹配问题。 因为List元素类型不能直接使用基础类型&#xff0c;必须使用基础类型的封装类型。 使用List的toArray(T [] a)也还是不行 发…