【序列化和反序列化】

在这里插入图片描述

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

  • 🍁典型解析
  • 🍁拓展知识仓
    • 🍁如何进行序列化和反序列化
    • 🍁未实现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.rhkb.cn/news/224370.html

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

相关文章

大师计划1.0 - log2 CRTO笔记

CRTOⅠ笔记 log2 这个笔记是我在2023年11月23日-12月22日中,学习CRTO所做的一些笔记。 事实上TryHackMe的路径和htb学院包含了许多CRTO的知识并且甚至还超出了CRTO(CS除外),所以很多东西在THM和htb学院学过,这次CRTO等…

如何使用PatchaPalooza对微软每月的安全更新进行全面深入的分析

关于PatchaPalooza PatchaPalooza是一款针对微软每月安全更新的强大分析工具,广大研究人员可以直接使用该工具来对微软每月定期推送的安全更新代码进行详细、全面且深入的安全分析。 PatchaPalooza使用了微软MSRC CVRF API的强大功能来获取、存储和分析安全更新数…

探索 HTTP 请求的世界:get 和 post 的奥秘(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

MY FILE SERVER: 1

下载地址 https://download.vulnhub.com/myfileserver/My_file_server_1.ova 首先我们需要发现ip 我的kali是59.162所以167就是靶机的 然后我们拿nmap扫一下端口 nmap -sV -p- 192.168.59.167 扫完发现有七个端口开放 按照习惯先看80 没看到有啥有用信息,用nikto扫一下 nik…

Kafka日志文件存储

日志文件 kafka在server.properties配置文件中通过log.dir属性指定了Kafka的日志存储路径 核心文件 1. log文件 实际存储消息的日志文件, 大小固定1G(参数log.segment.bytes可配置), 写满后就会新增一个新的文件, 文件名是第一条消息的偏移量 2. index文件 以偏移量为索引…

IP代理科普| 共享IP还是独享IP?两者的区别与优势

通俗地讲,共享IP就像乘坐公共汽车一样,您可以到达目的地,但将与其他乘客共享旅程,座位很可能是没有的。独享IP就像坐出租车一样,您可以更快到达目的地,由于车上只有您一个人,座位是您一个人专用…

java实现深度优先搜索 (DFS) 算法

度优先搜索(Depth First Search,DFS)算法是一种用于遍历或搜索图或树的算法。这种算法从一个节点开始,沿着一条路径尽可能深地搜索,直到遇到不能继续前进的节点时返回上一个节点,然后继续搜索其他路径。具体…

智能优化算法应用:基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.法医调查算法4.实验参数设定5.算法结果6.…

vs code 代码统计 插件 (webstorm统计代码)

https://blog.csdn.net/aikudexiaohai/article/details/129367503 安装插件 VS Code Counter使用快捷键 Ctrl Shift P,搜素“VSCodeCounter”,选择 Count lines in directory。 在文件路径搜索框中,补充待统计的目录,如&#x…

家校互通小程序实战开发01需求分析

目录 1 角色的划分2 用例分析3 创建业务数据源4 创建登录用户数据源总结 最近几年,随着移动互联网的深入发展,我们的日常生活和工作和微信已经紧密绑定。其实,有时候生活和工作的界限已经不明显,在我们的微信好友里既有家人、朋友…

看图了解ODF光纤配线架,详细熔接过程学习

弱电工程,远距离传输离不开光纤,只有光纤才能让网络传输的更远,今天了解光纤的配套产品,光纤配线架(Optical Distribution Frame)用于光纤通信系统中局端主干光缆的成端和分配,可方便地实现光纤…

多维时序 | MATLAB实CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测预测效果基本介…

一起玩儿物联网人工智能小车(ESP32)——14. 用ESP32的GPIO控制智能小车运动起来(二)

摘要:本文主要讲解如何使用Mixly实现对单一车轮的运动控制。 下面就该用程序控制我们的小车轮子转起来了。打开Mixly软件,然后单击顶部“文件”菜单中的“新建”功能,我们来开启一个新程序的开发工作。 我们的工作同样是先从最简单的开始&am…

等级保护实施指南与定级指南标准

目录 前言 等级保护实施指南标准 主要思路 主要概念 实例 主要流程 等级保护定级指南标准 安全保护等级 定级原理 级别划分表 定级方法 业务信息安全保护等级矩阵表 系统服务安全保护等级矩阵表 补充内容 前言 《实施指南》介绍和描述了实施信息系统等级保护过…

本地部署Jellyfin影音服务器并实现远程访问内网影音库

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…

大语言模型的三种主要架构 Decoder-Only、Encoder-Only、Encoder-Decoder

现代大型语言模型(LLM)的演变进化树,如下图: https://arxiv.org/pdf/2304.13712.pdf 基于 Transformer 模型以非灰色显示: decoder-only 模型在蓝色分支, encoder-only 模型在粉色分支, encod…

前端工程注入版本号

文章目录 一、前言二、webpack三、vite四、最后 一、前言 容器化时代,当页面出现问题时,如果你的新版本有可能已经修复了,那样你再排查它就没有意义了。为什么不一定是最新版本呢?一是可能是缓存作祟,二是可能运维成员…

Linux部署MeterSphere结合内网穿透实现远程访问服务管理界面

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

fragstats:景观指数趋势分析

作者:CSDN _养乐多_ 本文将介绍景观指数时间序列的趋势分析,包括趋势类型、斜率、截距等。以及景观指数突变分析所用的软件和 python 代码。 结果如下图所示, 图1 趋势分类图 图2 MK趋势分析 文章目录 一、景观指数计算二、景观指数时间序…

如何将本地websocket发布至公网并实现远程访问服务端

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…