java的序列化与反序列化

一、定义

Java序列化和反序列化:
序列化就是指把Java对象转换为字节序列的过程。(例如将一个类转化为json类型)
反序列化就是指把字节序列恢复为Java对象的过程。

在Java实际运用中,,许多方面应用序列化反序列化——持久化、通信、缓存、消息队列等。(这个过程是在 JVM 中独立完成的,可以依赖于 Java 的可移植性)

        序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
        反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
 在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化。

二、序列化时需要用到:

1.Serializable接口
        当一个类实现了这个接口时,代表这个类可以被JVM序列化和反序列化。
        序列化是将对象状态转换为可以传输或存储的格式的过程,反序列化则是将格式还原为对象的过程。
        实现Serializable接口的类必须谨慎管理类结构的变更,以确保序列化和反序列化的兼容性。

2.serialVersionUID属性
        是类的一个静态成员变量,标识类的版本。
        当类的结构发生变更时,如果没有设置serialVersionUID,JVM会根据类的结构自动生成一个默认值。
        为了确保序列化的兼容性,通常我们会手动设置一个固定的serialVersionUID值。这样即使类结构变更,只要serialVersionUID不变,序列化和反序列化就可以保持兼容。

3.transient关键字
        这个关键字可以修饰类的成员变量。
        被transient修饰的变量在序列化时会被忽略,不参与序列化和反序列化过程。(常用在不需要序列化一些敏感信息或者临时数据)

三、Java代码示例序列化

package com.hollis;
import java.io.Serializable;
import java.util.Date;public class User implements Serializable{private String name;private int age;private Date birthday;private transient String gender;private static final long serialVersionUID = -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 getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "User{" +"name='" + name + ''' +", age=" + age +", gender=" + gender +", birthday=" + birthday +'}';}
}
package com.hollis;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import java.io.*;
import java.util.Date;public class SerializableDemo {public static void main(String[] args) {//初始化User user = new User();user.setName("zhangsan");user.setGender("male");user.setAge(20);user.setBirthday(new Date());System.out.println(user);//写到FileObjectOutputStream oos = null;try {oos = new ObjectOutputStream(new FileOutputStream("tempFile"));oos.writeObject(user);} catch (IOException e) {e.printStackTrace();} finally {IOUtils.closeQuietly(oos);}//从File读File file = new File("tempFile");ObjectInputStream ois = null;try {ois = new ObjectInputStream(new FileInputStream(file));User newUser = (User) ois.readObject();System.out.println(newUser);} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} finally {IOUtils.closeQuietly(ois);try {FileUtils.forceDelete(file);} catch (IOException e) {e.printStackTrace();}}}
}

总结


1、在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化(要想将父类对象也序列化,就需要让父类也实现Serializable 接口,)

2、通过IO类ObjectOutputStream和ObjectInputStream,中的writeObject()、readObject()方法 ,对对象进行序列化及反序列化

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

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

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

6、常用于文件和数据库的持久化、通信、缓存、消息队列等

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

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

相关文章

重塑楼宇管理:智慧管控可视化开启高效新篇章

借助图扑智慧楼宇管控可视化技术,实现实时监控与智能化管理,快速响应潜在问题,确保楼宇安全、节能和高效运行。

Git之解决重复输入用户名和密码(三十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

快速入门Linux及使用VSCode远程连接Linux服务器

在当前的技术环境中,Linux操作系统因其强大的功能和灵活性而广受欢迎。无论你是开发人员、系统管理员还是技术爱好者,学习Linux都是提升技术技能的重要一步。本文将介绍如何快速入门Linux,并使用Visual Studio Code(VSCode&#x…

时光正好保剑锋的抱治百病与成年人的世界

《时光正好》:保剑锋的“抱治百病”与成年人的世界在繁忙的都市里,每个角落上演着各自的人生戏码。而在这些戏码中,由保剑锋主演的《时光正好》无疑成为了近期引人注目的焦点。这部电视剧以其真实而深刻的剧情,让我们看到了成年人…

深入了解Linux中的db_dump185命令

深入了解Linux中的db_dump185命令 在Linux系统中,db_dump185可能不是一个广为人知的命令,但它对于某些特定的数据库或文件系统任务来说却是一个非常有价值的工具。特别是当你与旧版的Berkeley DB数据库或类似的存储机制打交道时,db_dump185可…

SpringBoot+Vue实现前后端分离基本的环境搭建

目录 一、Vue项目的搭建 (1)基于vite创建vue项目 (2)引入elementplus (3)启动后端服务,并测试 二、SpringBoot项目的搭建 (1)通过idea创建SpringBoot项目 &#x…

有效的括号(oj题)

一、题目链接 https://leetcode.cn/problems/valid-parentheses/submissions/538110206 二、题目思路 利用栈的性质,后进先出 1.依次读取字符串,判断是否为左括号,如果是,就将其入栈。 2.如果读取的不是左括号,就说…

【网络教程】Iptables官方教程-学习笔记7-简单理解IPTABLES规则的作用流程

前面学习了IPTABLES的所有功能介绍后,一个Linux设备里的IPTABLES规则集是如何运行的,这里简单做个介绍。 在Linux设备里输入"iptables -nvl",得到该设备的所有防火墙规则,得到的结果中可以看到这个设备防火墙里所有的链以及链里的…

Git从入门到放弃

由于我的Git学的不太好,所以为了能够将以后我的学习笔记能够整理的更好,我先要系统的学习一下git,文章由此产生。 文章笔记源自尚硅谷Git入门到精通全套教程视频内容 1 进入官网 学习新技术的第一步需要熟悉官网,Git也不例外。ht…

【区分vue2和vue3下的element UI ¶Upload 上传组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 中,我们通常使用 Element UI 的 el-upload 组件来实现文件上传功能。然而,在 Vue 3 中,由于 Element UI 没有官方支持 Vue 3 的版本,我们通常会使用 Element Plus(Element UI 的 Vue 3 版本)的 el…

海豚调度器调用api接口启动工作流(亲试可用)

一、前言 在大数据时代,工作流调度器成为了数据管道和ETL任务中不可或缺的工具。DolphinScheduler作为一款强大的工作流调度器,支持多种任务类型和工作流的可视化管理。除了通过Web界面操作外,DolphinScheduler也提供了API接口,使得第三方系统集成和自动化脚本调用成为可能…

理论学习-自动控制

自动控制 前馈控制简介表现形式前馈 - 反馈 结合使用 前馈控制 简介 前馈控制 什么?作用 ?条件? 没有表达形式(具体的),控制方法。提高响应速度,减小误差,增加带宽而不改变稳定性…

Langchain的向量存储 - Document与简单字符串列表的区别

文章目录 前言一、 使用简单字符串列表1. 示例2. 优点3. 缺点 二、 使用 Document 类1. 示例2. 优点3. 缺点 三、 综合比较四、 示例对比1:简单字符串列表2:使用 Document 类 总结 前言 在 LangChain 中,使用简单字符串列表(如 t…

【Python报错】已解决AttributeError: ‘Series’ object has no attribute ‘columns’

成功解决“AttributeError: ‘Series’ object has no attribute ‘columns’”错误的全面指南 一、引言 在Python的数据处理和分析中,Pandas库是一个不可或缺的工具。然而,在使用Pandas时,可能会遇到各种错误,其中之一就是“Att…

【C++】、【Redis】、【人工智能】与【大数据】的深度整合

C++、Redis、人工智能和大数据的深度整合涉及多个方面,包括数据存储、处理、优化以及在不同技术栈之间的交互。以下是对这四个领域深度整合的详细分析: 一、C++与Redis的整合 数据存储与访问: Redis作为一个高性能的Key-Value数据库,非常适合作为C++应用的缓存层。通过hir…

k8s 对外发布(ingress)

在k8s中,service的作用体现在两个方面,对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制; 对集群外部,他类似负载均衡器,可以在集…

HTML静态网页成品作业(HTML+CSS)—— 24节气立夏介绍网页(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

使用Python创建Word文档

使用Python创建Word文档 安装python-docx库创建Word文档代码效果 在这篇文章中,我们将介绍如何使用 Python创建一个Word文档。首先,我们需要安装python-docx库,然后通过一段简单的代码示例展示如何创建和编辑Word文档。 安装python-docx库 …

【pytest】为什么不能使用__init__

示例代码分析 以下是一个简单的示例,演示了在 pytest 中使用 __init__ 方法导致的问题: class TestClass:def __init__(self):self.x 10def test_add(self):self.x 5assert self.x 15def test_main():pytest.main()在这个示例中,TestCla…

RPA影刀 | 变量的使用

1.什么是变量 2.变量的作用 作用1:方便后续流程调用 这里在后续流程“点击元素”中,就可以选中这个变量 作用2:区分相同属性的变量 如果要打开两个网页,总不能都叫web_page吧。 所以这里一个叫百度web_page,一个叫…