java序列化的作用

article/2025/9/14 3:53:56

1.java序列化需要实现Serializaible接口或者Externalizable接口

2.java实现序列化的作用:

        1.方便在远程调用时对象的解码与编码,就像new对象之间直接调用,不需要像传输对象之间像JSON转换一样转来转去

        2.序列化的能力:为了在程序中能直接以对象的形式进行保存,直接进行调用

        序列化的方式:按照一定的格式将java对象的状态转成可接受的形式,以便于存储和运输

按照一定的格式将java对象的状态转成可接受的形式(对象持久到介质中,像实现对象直接存储)

        3.对象可以自定义存储格式        (没例子)

例子:

常见的使用方式是直接将对象写入流中,比如下面的例子中,创建了FileOutputStream对象,对应输出到tmp.o文件中。然后创建ObjectOutputStream对象嵌套前面的输出流,当我们调用writeObject方法时即能进行序列化操作。(本质直接存储到磁盘吧)

writeObject方法需要特别说明一下,当我们对某个对象进行写入时,其实不仅仅序列化该对象,它还会去遍历寻找相关引用的其它对象,由自己和其它引用对象组成的一个完整的对象图关系都会被序列化。除了一些特殊指定的类,普通类必须实现Serializable或Externalizable接口才能被序列化。

问题:

平常实体类没有实现Serializable接口,怎么也能存进数据库呢?是因为在声明变量的时候,例如String、int、Boolean等时,数据类型已经实现了序列化

注意父类的序列化

如果一个子类实现了Serializable接口而父类没有实现该接口,则在序列化子类时,子类的属性状态会被写入而父类的属性状态将不被写入。所以如果想要父类属性状态也一起参与序列化,就要让它也实现Serializable接口。

哪些字段会被序列化:

3.反序列化:

        1.即通过字节流还原对象

        例子反序列化是序列化的反向操作,即通过字节流来还原Java对象。看下面的例子,首先创建FileInputStream对象,其对应的文件为tmp.o。然后创建ObjectInputStream对象嵌套前面的输入流,接着则可以调用readObject方法读取对象。readObject方法除了会恢复对象自己之外,它还会遍历整个完整的对象图关系,创建整个对象图包含的所有对象。

另外,如果父类未实现Serializable接口则反序列化生成的对象会再次调用父类的构造函数,以此完成对父类的初始化。所以父类属性初始值一般都是类型的默认值。比如下面的代码,Father类的属性不会参与序列化,反序列化时Father对象的属性的值为默认值0。

 

在序列化时对象的哪些字段会参与到序列化中呢?其实有两种方式决定哪些字段会被序列化。一是默认方式,Java对象中的非静态和非transient的字段都会被定义为需要序列化的字段。另外一种方式是通过ObjectStreamField数组来声明需要序列化的对象。

可以看到对象中普通的属性都是默认会被序列化的,而如果某些包含了敏感信息的属性我们不希望它参与序列化,那么最简单的方式就是可以将该字段声明为transient。

如何使用ObjectStreamField呢?举个例子,如下代码中A类中有name和password两个字段,我们通过ObjectStreamField数组声明只需序列化name字段。我们不必纠结为什么这样声明,这仅仅是一个约定而已。

Externalizable接口

Externalizable接口主要就是提供给用户自己控制序列化内容,虽然前面我们也看到了transient和ObjectStreamField都能定义参与序列化的字段,但实际上Externalizable接口提供了更加灵活的方式。可以看到它其实继承了Serializable接口,然后提供了writeExternal和readExternal两个方法,我们就是在这两个方法内控制序列化和反序列化。

 比如下面的例子,我们可以在writeExternal方法中额外写入Date对象,然后再写入value值。对应地,反序列化时则是在readExternal方法中读取Date对象和value。这样就完成了自定义序列化操作。

 写入时代替:

正常情况下序列化某个对象时写入的正是当前的对象,但如果说我们要替换当前的对象而写入其他对象的话则可以通过writeReplace方法来实现。比如下面,person类通过writeReplace方法最终可以写入Object数组对象。所以我们在反序列化时就不再是转换成Person类型,而是要转换为Object数组对象。

 读取时代替:

上面介绍了在写入时可以替换对象,而在读取时也同样支持替换对象的,它是通过readResolve方法实现的。比如下面的代码,在readResolve方法返回2222,则反序列化读取时不再是Person对象,而是2222。

AQS序列化 :

JDK内置并发AQS同步器实现了Serializable接口,其中head和tail变量声明为transient。也就是说如果对AQS同步器对象进行序列化的话,队列是不参与序列化的,只有同步状态会参与序列化。也就是说序列化会让AQS丢失队列信息,只能保留同步状态信息。

 


http://chatgpt.dhexx.cn/article/7FfJWVXI.shtml

相关文章

Java序列化与反序列化

参考链接: Java 序列化与反序列化_Jacks丶的博客-CSDN博客_java反序列化 1 序列化与反序列化的概念 Java 序列化是指:将对象转化成一个字节序列(二进制数据)的过程。 将序列化对象写入文件之后,可以从文件中读取出来,并且对它…

Java序列化

一、什么是序列化?为什么要序列化? Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程。 我们都知道,在进行浏览器访问的时候,我们看到的文本、图片、音频、视频等都是通…

【JAVA基础】java基础之-序列化详解

写在前面的话 脑子是个好东西,可惜的是一直没有搞懂脑子的内存删除机制是什么,所以啊,入行多年,零零散散的文章看了无数,却总是学习了很多也忘了很多。 痛定思痛的我决定从今天开始系统的梳理下知识架构,记…

JAVA的序列化

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

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…