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

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

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

  • 序列化和反序列化是计算机科学中两个重要的概念,主要应用在数据存储和网络传输等场景。
  • 序列化是将数据结构或对象状态转换为可以存储或传输的形式的过程。这种形式要求在重新构建原始对象时能够在其他环境或在程序运行的后续时间点使用。这个过程主要通过将对象的数据转化为字节流来实现,也可以将其转化为格式如 XML 或 JSON 的数据,以便在网络上进行传输或在磁盘上进行存储。
  • 举个例子,假设你有一个复杂的数据结构,如一个包含多个字段和数组的对象。你不能直接将这个对象写入文件或通过网络发送。因此,你需要先将其转换为可以写入或发送的格式,这就是序列化。
  • 反序列化是序列化的逆过程,也就是从一系列字节中提取出数据结构。在接收到序列化的数据(如从文件或网络)后,通过反序列化,可以将数据恢复为原始的对象或数据结构,从而可以在程序中使用。
  • 以上述的例子,反序列化就是读取该文件或接收到的数据,并根据序列化时的格式将其恢复为原始的对象。
  • 这两个过程在很多编程语言中都有内置的支持,例如在 Java 中,你可以使用 java.io.Serializable 接口来对对象进行序列化和反序列化;在 Python 中,你可以使用 pickle 模块进行序列化和反序列化;在 JavaScript 中,你可以使用 JSON 的 stringifyparse 方法进行序列化和反序列化等。

在java中实现序列化和反序列化,为什么要实现Serializable接口?

  • Serializable 接口是一种标记接口,本身并没有定义任何方法,但是它向 JVM 提供了一个指示,表明实现该接口的类可以被序列化和反序列化。这意味着你可以将该类的对象转换为字节流(序列化),然后再将这个字节流转回为对象(反序列化)。
  • 序列化的过程是 JVM 通过反射来完成的,它会查看对象的类是否实现了 Serializable 接口。如果没有实现,将会抛出一个 NotSerializableException 异常。
  • 实现 Serializable 接口的主要原因如下:
    • 允许 JVM 序列化对象:如上所述,JVM 只会序列化实现 Serializable 接口的对象。
    • 表示类的实例可以被安全地序列化:实现 Serializable 接口的类表示它满足 JVM 对于序列化的要求。这不仅仅是类的实例可以被转换为字节流,还包括这个类的实例可以被反序列化,而且反序列化后的对象保持了原始对象的状态。
    • 允许类的实例在 JVM 之间进行传输:序列化的一个重要应用是在网络应用或分布式系统中,允许对象在 JVM 之间进行传输。只有实现 Serializable 接口的对象才能通过网络进行传输。
    • 持久化:序列化也被用于将对象的状态持久化,即将对象存储在数据库、文件或内存中,然后在需要的时候再进行恢复。实现 Serializable 接口的对象可以被持久化。
  • 综上,实现 Serializable 接口是为了使对象可以被序列化和反序列化,以便在不同的环境或时间点恢复对象的状态,或在 JVM 之间传输对象,或将对象的状态持久化。

案例

  • 当然可以。下面这个简单的例子中,我们将创建一个实现了 Serializable 接口的类 Person,然后进行序列化和反序列化:

  • 首先,我们创建一个实现了 Serializable 接口的 Person 类:

  • import java.io.Serializable;public class Person implements Serializable {private static final long serialVersionUID = 1L;private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
    }
    
  • 接下来,我们创建一个序列化这个 Person 对象的类 SerializeDemo

  • import java.io.FileOutputStream;
    import java.io.ObjectOutputStream;public class SerializeDemo {public static void main(String[] args) {Person p1 = new Person("John Doe", 30);try {FileOutputStream fileOut = new FileOutputStream("/tmp/person.ser");ObjectOutputStream out = new ObjectOutputStream(fileOut);out.writeObject(p1);out.close();fileOut.close();System.out.println("Serialized data is saved in /tmp/person.ser");} catch (Exception e) {e.printStackTrace();}}
    }
    
  • 现在我们来反序列化这个 Person 对象,创建一个类 DeserializeDemo

  • import java.io.FileInputStream;
    import java.io.ObjectInputStream;public class DeserializeDemo {public static void main(String[] args) {Person p = null;try {FileInputStream fileIn = new FileInputStream("/tmp/person.ser");ObjectInputStream in = new ObjectInputStream(fileIn);p = (Person) in.readObject();in.close();fileIn.close();} catch (Exception e) {e.printStackTrace();}System.out.println("Deserialized Person...");System.out.println("Name: " + p.getName());System.out.println("Age: " + p.getAge());}
    }
    
  • 以上就是一个完整的 Java 序列化和反序列化的例子。首先我们创建了一个 Person 对象并序列化到一个文件中,然后我们从这个文件中读取数据并反序列化回 Person 对象。

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

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

相关文章

Windows电脑显示部分功能被组织控制

目录 问题描述 解决方法 总结 问题描述 如果你的电脑出现以上情况,建议你使用我这种方法(万不得已) 解决方法 原因就是因为当时你的电脑在激活的时候是选择了组织性激活的,所以才会不管怎么搞,都无法摆脱组织的控…

十五、异常(4)

本章概要 Java 标志异常 特例:RuntimeException 使用 finally 进行清理 finally 用来做什么?在 return 中使用 finally缺憾:异常丢失 Java 标准异常 Throwable 这个 Java 类被用来表示任何可以作为异常被抛出的类。Throwable 对象可分为两…

C/C++笔试面试真题

C/C++笔试面试真题 1、堆和栈的区别 1、栈由系统自动分配,而堆是人为申请开辟; 2、栈获得的空间较小,而堆获得的空间较大; 3、栈由系统自动分配,速度较快,而堆一般速度比较慢; 4、栈是连续的空间,而堆是不连续的空间。 2、什么是野指针?产生的的原因? 野指针的指向的…

ubuntu下源码编译方式安装opencv

基础条件 ubuntu 20.04 opencv 3.4.3 opencv 源码编译的安装步骤 第一步, 首先clone源码 git clone https://github.com/opencv/opencv.git第二步,依赖包,执行下面的命令 sudo apt-get install build-essential sudo apt-get install cmak…

记一次Mybatis驼峰命名导致的线上BUG及处理方案

前言 方向从一开始就错了,还是执着的去寻找问题的解决方案,简直就是一场重大灾难,但这也是每个修行者的必由之路。这个线上问题,差点让我的心里防线崩溃,苦寻无门,最终得以解决也多亏了身边的各路大佬的群…

Android studio “Layout Inspector“工具在Android14 userdebug设备无法正常使用

背景描述 做rom开发的都知道,“Layout Inspector”和“Attach Debugger to Android Process”是studio里很好用的工具,可以用来查看布局、调试系统进程(比如setting、launcher、systemui)。 问题描述 最进刚开始一个Android 14…

数据结构与算法之堆: Leetcode 215. 数组中的第K个最大元素 (Typescript版)

数组中的第K个最大元素 https://leetcode.cn/problems/kth-largest-element-in-an-array/ 描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。…

Android Shape设置背景

设置背景时&#xff0c;经常这样 android:background“drawable/xxx” 。如果是纯色图片&#xff0c;可以考虑用 shape 替代。 shape 相比图片&#xff0c;减少资源占用&#xff0c;缩减APK体积。 开始使用。 <?xml version"1.0" encoding"utf-8"?…

云安全之HTTP协议介绍

HTTP的基本概念 什么是网络协议 网络协议是计算机之间为了实现网络通信而达成的一种“约定”或者”规则“&#xff0c;有了这种”约定不同厂商生产的设备&#xff0c;以及不同操作系统组成的计算机之间&#xff0c;就可以实现通信。 网络协议由三个要素构成&#xff1a;1、语…

WSL2和ubuntu的安装过程

目录 1.WSL2的安装 2.Ubuntu的安装 3.安装完成后的打开方式 1.WSL2的安装 按下WINX键&#xff0c;选择Windows PowerShell (管理员) 1.1执行以下命令&#xff0c;该命令的作用是&#xff1a;启用适用于 Linux 的 Windows 子系统 dism.exe /online /enable-feature /featur…

Oracle 快速入门

当你刚开始探索 Oracle 数据库时&#xff0c;可能会觉得有些复杂。然而&#xff0c;本文将为你提供 Oracle 数据库的快速入门指南&#xff0c;帮助你迅速上手这个强大的关系型数据库管理系统&#xff08;RDBMS&#xff09;。无论你是数据库新手还是有经验的数据库管理员&#x…

【小沐学前端】Node.js实现基于Protobuf协议的WebSocket通信

文章目录 1、简介1.1 Node1.2 WebSocket1.3 Protobuf 2、安装2.1 Node2.2 WebSocket2.2.1 nodejs-websocket2.2.2 ws 2.3 Protobuf 3、代码测试3.1 例子1&#xff1a;websocket&#xff08;html&#xff09;3.1.1 客户端&#xff1a;yxy_wsclient1.html3.1.2 客户端&#xff1a…

【踩坑日记】Docker elasticsearch too many open files问题处理

项目场景&#xff1a; 使用单机ES作为日志存储数据库&#xff0c;每日生成一个日期索引&#xff0c;由于每日的数据量可能较大&#xff0c;有时候需要进行磁盘扩容操作&#xff0c;本次问题记录还未找到根本的触发原因&#xff0c;后续找到原因后再进行记录 问题描述 每日创建…

利用mAP计算yolo精确度

当将yolo算法移植部署在嵌入式设备上&#xff0c;为了验证算法的准确率。将模型测试的结果保存为txt文件&#xff08;每一个txt文件&#xff0c;对应一个图片&#xff09;。此外&#xff0c;需要将数据集中的标签由[x,y,w,h]转为[x1,y1,x2,y2]。最后&#xff0c;运行验证代码 …

【redisson学习笔记】

1)clone项目 git clone https://github.com/redisson/redisson.git本来想直接用maven编译源码&#xff0c; 却发现各种错误&#xff0c;主要是maven的编译插件版本问题。 2)然后用maven包方式引入 <dependencies><dependency><groupId>org.redisson</gr…

Secureboot从入门到精通

关键词&#xff1a;trustzone视频、tee视频、ATF视频、secureboot视频、安全启动视频、selinux视频&#xff0c;cache视频、mmu视频&#xff0c;armv8视频、armv9视频 FF-A视频、密码学视频、RME/CCA视频、学习资料下载、免费学习资料、免费 周贺贺&#xff0c;baron&#xff0…

把握现在,热爱生活

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录 厨艺房价琐事计划随想 今年的中秋国庆假期放8天&#xff0c;比春节假期…

【RuoYi项目分析】网关的AuthFilter完成“认证”,注意是认证而不是权限

文章目录 1. 功能介绍2. AuthFilter的配置3. AuthFilter实现分析4. 资料参考 过滤器的功能是检验经过网关的每一个请求&#xff0c;检查 token 中的信息是否有效。 注意是“认证检查”&#xff0c;而不是“权限” 1. 功能介绍 1、在用户完成登录后&#xff0c;程序会把用户相关…

Centos7配置firewalld防火墙规则

这里写自定义目录标题 欢迎使用Markdown编辑器一、简单介绍二、特点和功能2.1、区域&#xff08;Zone&#xff09;2.2、运行时和永久配置2.3、服务和端口2.4、动态更新2.5、连接跟踪2.6、D-Bus接口 三、设置规则3.1、启动防火墙服务3.2、新建防火墙规则的服务&#xff0c;添加端…

分布式链路追踪--SkyWalking7.0.0+es7.0.0

分布式链路追踪–SkyWalking ​ 微服务的出现&#xff0c;的确解决了一些业务痛点&#xff0c;但是也造成了新的问题比如随着调用链的拉长&#xff0c;如果想要知道请求为什么这么慢&#xff0c;这个请求到底经历了哪些环节&#xff0c;又依赖了哪些东西&#xff0c;在微服务架…