【序列化和反序列化】

在这里插入图片描述

🍁什么是序列化和反序列化?

  • 🍁典型解析
  • 🍁拓展知识仓
    • 🍁如何进行序列化和反序列化
    • 🍁未实现Serializable,可以序列化吗?


🍁典型解析


在Java中,我们可以通过多种方式来创建对象,并且只要对象没有被回收我们都可以复用该对象。但是,我们创建出来的这些Java对象都是存在于JVM的堆内存中的。只有JVM处于运行状态的时候,这些对象才可能存在。一旦JVM停止运行,这些对象的状态也就随之而丢失了。


但是在真实的应用场景中,我们需要将这些对象持久化下来,并且能够在需要的时候把对象重新读取出来。Java的对象序列化可以帮助我们实现该功能。


对象序列化机制 (Obiect Serialization) 是Java语言内建的一种对象持久化方式,通过对象序列化,可以把对象的状态保存为字节数组,并且可以在有需要的时候将这个字节数组通过反序列化的方式再转换成对象。对象序列化可以很容易的在JVM中的活动对象和字节数组 (流)之间进行转换。


所以序列化就是把Java对象序列化成字节数组的过程,反序列化就是把字节数组再转换成Java对象的过程。


🍁拓展知识仓


🍁如何进行序列化和反序列化


在Java中,只要一个类实现了java.io.Serializable;接口,那么它就可以被序列化,这里先上一段代码:


package com.ifbranch.test;import java.io.Serializable;import java.util.Date;/*** @author 昕宝爸爸爱编程* */@SuppressWarnings("all")
public class User implements Serializable {private String name;private int age;private Date brithday;private transient String gender;private static final long serialIVersionUID = -6849794470754667710L;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Date getBrithday() {return brithday;}public void setBrithday(Date brithday) {this.brithday = brithday;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "User [name=" + name + ", "+ "age=" + age + ", brithday=" + brithday + ", "+ "gender=" + gender + "]";}
}

Code 2 是对 User 类进行序列化 和 反序列化的Demo:


package com.ifbranch.test;import org.apache.commons .io.FileUtils;import org.apache.commons .io.IOUtils;import java.io.*;import java.util.Date;/*** @author 昕宝爸爸爱编程* */public class SerializableDemo {public static void main(String[] args) {//Initializes The ObiectUser user = new User();user .setName("xinbaodad") ;user.setGender("male") ;user.setAge(23);user.setBirthday(new Date());System.out.println(user);//Write Obj to FileObjectOutputstream oos = null;try {oos = new ObjectOutputStream(new FileOutputStream("tempFile"));oos.writeObject(user);} catch (IOException e) {e.printStackTrace();}finally {IOUtils.closeQuietly(oos);}//Read Obj from FileFile file = new File("tempFile");ObjectInputstream ois = null;try {ois = new ObjectInputstream(new FileInputstream(file));User newUser = (User) ois.readObiect();System.out.printIn(newUser);} catch (IOException e) {e.printStackTrace();} finally {IOUtils.closeOuietly(ois);try {IOUtils.closeOuietly(ois);}  catch (IOException e)  {e.printstackTrace() ;}}}
}//output
//User[name='xinbaodad', age=23, gender=male, birthday=Tue Feb 02 17:37:38 CST 2016]
//User[name='xinbaodad', age=23, gender=null, birthday=Tue Feb 02 17:37:38 CST 2016]

以下几个和序列化&反序列化有关的知识点大家可以重点关注一下:


1、在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化。


2、通过ObiectOutputStream和ObiectlnputStream对对象进行序列化及反序列化


3、虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化ID 是否一致 (就是 private static final long serialVersionUID)


4、序列化并不保存静态变量


5、要想将父类对象也序列化,就需要让父类也实现Serializable 接口


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


7、服务器端给客户端发送序列化对象数据,对象中有一些数据是敏感的,比如密码字符串等,希望对该密码字段在序列化时,进行加密,而客户端如果拥有解密的密钥,只有在客户端进行反序列化时,才可以对密码进行读取这样可以一定程度保证序列化对象的数据安全。


🍁未实现Serializable,可以序列化吗?


如果使用Java原生的序列化机制 (即通过 ObjectOutputStream 和 ObjectlnputStream 类),则对象必须实现Serializable 接口。如果对象没有实现这个接口,尝试原生序列化会地出 NotSerializableException。


对于像Jackson、Gson这样的JSON序列化库或用于XML的库(如JAXB),对象不需要实现 Serializable 接口文些库使用反射机制来访问对象的字段,并将它们转换成JSON或XML格式。在这种情况下,对象的序列化与Serializable 接口无关。

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

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

相关文章

我的NPI项目之Android电源系列(四) -- 关于剩余充满时间的问题的代码跟踪-max1720x_battery.c qpnp-smb2.c

从我的NPI项目之Android电源系列(三), 能够看出,healthd是通过读取/sys/class/power_supply/battery/time_to_full_now而进行充满剩余时间的。 在/sys/class/power_supply/battery/...目录下有很多文件,具体内容如下: /sys/class…

详谈 springboot整合shiro

背景: 本章将进一步的落地实践学习,在springboot中如何去整合shrio,整个过程步骤有个清晰的了解。 利用Shiro进行登录认证主要步骤: 1. 添加依赖:首先,在pom.xml文件中添加Spring Boot和Shiro的相关依赖…

java接口限流详解

目录 1.简介1.1.为什么需要限流?1.2.限流和熔断有什么区别?1.3.限流和削峰有什么区别?1.4 缓存,降级,限流简介 2.应用级限流2.1 控制并发数量2.2 控制访问速率2.2.1 令牌桶算法2.2.2 漏桶算法 3.分布式限流4.交流群 1.简介 接口…

漏洞复现-红帆OA iorepsavexml.aspx文件上传漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

浅谈师范双非普本工科专业的秋招历程

本人普通师范院校通信工程专业,于秋招历程之中四处碰壁,迫于家庭等各种因素考虑,最终选择移动的偏远县城岗位的OFFER!本人秋招历程之中,屡屡碰壁,也算得上“收获满满”!我简单给各位浅谈一下我的…

气动冷凝水回收泵机械浮球泵的特点工作原理介绍 不需要电源

​ 1:气动凝水回收泵机械式介绍 气动冷凝水回收泵是一种设计用于不使用电力来泵送冷凝液、油和其他高温液体等的设备。它无需维护,能将大量凝结水和其它液体从低位、低压或真空场所泵送到高处及高压区域。与传统电泵相比,气动冷凝水回收泵可…

八股文打卡day10——计算机网络(10)

面试题:HTTP1.1和HTTP2.0的区别? 我的回答: 1.多路复用:HTTP1.1每次请求响应一次都得建立一次连接,HTTP1.1引入了持久连接Connection:Keep-Alive,可以建立一次连接,进行多次请求响…

cmake常见操作记录(持续更新)

cmake常见操作记录 通用1. 指定生成目录2. 指定宏3. 设置编译类型(Debug,Release) linuxwindwos1. windows下设置编译位数 通用 1. 指定生成目录 cmake -B build .2. 指定宏 SET(_COMPACT_ false CACHE BOOL "whether to compact.&qu…

放大电路的静态分析和动态分析例题

(一) (二) (三) (四) (五)

QT中,socket通讯要考虑哪些问题?(面试题)

在Qt中进行Socket通信时,需要考虑以下几个问题: 连接建立和断开:确保在客户端和服务器端之间能够正确地建立和断开连接,以便进行正常的数据传输。 数据传输格式:确定数据传输的格式,包括数据的编码方式、数…

Spring Boot学习随笔- 第一个Thymeleaf应用(基础语法th:,request、session作用域取值)

学习视频:【编程不良人】2021年SpringBoot最新最全教程 第十五章、Thymeleaf Thymeleaf是一种现代化的服务器端Java模板引擎,专门用于Web和独立环境。Thymeleaf在有网络和无网络的环境下皆可运行,即可以让美工在浏览器查看页面的静态效果&am…

34. 在排序数组中查找元素的第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 题目链接&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 代码如下&#xff1a; class Solution { public:vector<int> searchRange(vector<int>& nums, int target) {vector<int> range…

下载MySQL Connector/C++

MySQL :: Download Connector/C

MySQL 一个线程(或事务)在更新表时,另一个线程能否读取这个表

在MySQL中&#xff0c;一个线程&#xff08;或事务&#xff09;在更新表时&#xff0c;另一个线程能否读取这个表主要取决于两个因素&#xff1a;使用的事务隔离级别和锁的类型。MySQL默认使用行级锁&#xff0c;这意味着锁定的范围相对较小&#xff0c;通常不会锁定整个表。下…

智能优化算法应用:基于向量加权平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于向量加权平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于向量加权平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.向量加权平均算法4.实验参数设定…

《C++避坑神器·二十五》简单搞懂json文件的读写之遍历json文件读写

json.hpp库放在文章末尾 1、遍历json文件读写 &#xff08;1&#xff09;插入新键值对到json之情形1 原来json文件如下所示&#xff1a; {"Connection": {"IpAddress": "192.168.20.1","Rock": 0,"Solt": 1}, "Data…

Springboot的测试类出现java.lang.Exception: No runnable methods的解决方法(万能)

目录 1. 问题所示2. 原理分析3. 解决方法4. 补充1. 问题所示 使用Springboot测试的时候出现如下问题: 十二月 24, 2023 6:33:12 下午 org.junit.vintage.engine.discovery.TestCl

opencv入门到精通——形态学转换

目录 目标 理论 1. 侵蚀 2. 扩张 3. 开运算 4. 闭运算 5. 形态学梯度 6. 顶帽 7. 黑帽 结构元素 目标 在这一章当中&#xff0c; 我们将学习不同的形态学操作&#xff0c;例如侵蚀&#xff0c;膨胀&#xff0c;开运算&#xff0c;闭运算等。我们将看到不同的功能&…

前端---html 的介绍

1. 网页效果图 --CSDN 2. html的定义 HTML 的全称为&#xff1a;HyperText Mark-up Language, 指的是超文本标记语言。 标记&#xff1a;就是标签, <标签名称> </标签名称>, 比如: <html></html>、<h1></h1> 等&#xff0c;标签大多数都是…

【数据结构】查找与排序

要查询信息&#xff0c;涉及两个问题&#xff1a; 在哪里查&#xff1f;——查找表 怎么查&#xff1f;——查找方法 一.查找 1.查找表的定义&#xff1a; 查找表是由同类型的数据元素构成的集合 2.对查找表的基本操作&#xff1a; 1&#xff09;查询某个数据元素是否在查…