基于 ObjectOutputStream 实现 对象与二进制数据 的序列化和反序列化

目录

为什么要进行序列化呢?

如何实现 对象与二进制数据 的序列化和反序列化?


为什么要进行序列化呢?


主要是为了把一个对象(结构化的数据)转化成一个 字符串 / 字节数组,方便我们存储(有时候需要将数据存储到文件中,而文件只能存 字符串 / 二进制数据,不方便直接存储 对象)和传输数据(通过网络传输).

如何实现 对象与二进制数据 的序列化和反序列化?


实际上针对二进制序列化也是有很多种方案的:

1. Java 标准库提供了序列化的方案,ObjectInputStream 和 ObjectOutputStream(推荐).

2. Hessian.

3. protobuffer

4. thrift.

5. 通过一些转化也可以使用 JSON 表示二进制数据(JSON 格式中有很多特殊符号:" {} 这些符号会影响 JSON 格式的解析):可以针对 二进制数据 进行 base64 编码. base64 的作用就是用 4 字节表示 3 个字节信息,会保证 4 个字节都是使用 文本字符(相当于是把 二进制数据转换成文本了, 就像是 HTML  中嵌入一个图片,就可以把图片的二进制 base64 编码 直接以文本的形式嵌入到 html 中),但是 base64 这种方案,效率低,有额外的转码开销,同时还会使空间变大.

Ps:这里我们使用方案一,也就是标准库自带的方案,这个方案最大的好处就是不必引入额外的依赖.

具体实现如下:

  1. 首先,如果想要这个对象能够序列化或者反序列化,就需要这个类能实现 Serializable 接口(无需重写任何方法)
  2. ByteArrayOutputStream(字节数组输出流,用于输出一个字节数组):把 对象 序列化成 字节数组,流对象就相当于是一个变长的字节数组,通过 object 序列化数据,然后逐渐写入到 ByteArrayOutputStream 中,再统一转化成 byte[] 即可.
  3. ByteArrayInputStream(字节数组输入流,用于输入一个字节数组):把 字节数组 反序列化成 对象,将需要转化的二进制数据交给 byteArrayInputStream,再把 byteArrayInputStream 交给 ObjectInputStream ,然后通过 readObject 方法就可以反序列化成对象了.
public class BinaryTool {/*** 把一个对象序列化成一个字节数组* @param object* @return*/public static byte[] toBytes(Object object) throws IOException {try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {//此处 writeObject 就会把该对象进行序列化,生成的二进制字节数据,写入到 ObjectOutputStream 中//又由于 ObjectOutputStream 又关联到了 ByteArrayOutputStream,最终就写入到了 ByteArrayOutputStreamobjectOutputStream.writeObject(object);}return byteArrayOutputStream.toByteArray();}}/*** 把一个字节数组反序列化成对象* @param data* @return* @throws IOException* @throws ClassNotFoundException*/public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {Object object = null;try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {//此处的 readObject 就是从 data 这个 byte 中读取数据并进行反序列化object = objectInputStream.readObject();}}return object;}}

 

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

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

相关文章

软件测试工程师面试如何描述自动化测试是怎么实现的?

软件测试工程师面试的时候,但凡简历中有透露一点点自己会自动化测试的技能点的描述,都会被面试官问,那你结合你的测试项目说说自动化测试是怎么实现的?一到这里,很多网友,包括我的学生,也都一脸…

编写时源码优化插件试验品

我又来倒垃圾啦 自己垃圾桶里的这个:egg language server on VSCode | Framist’s Little House 用蛋消灭魔鬼!编写时源码优化插件 egg-language-server 🧪 in developing Source Code Optimization Tools at Writing-time 特性 demo | 点击跳…

Springboot项目启动后按顺序加载自定义类 (demo)

1. 实现ApplicationRunner接口, 重写run方法 import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import org.springframewor…

SQL 语句解析过程详解

SQL 语句解析过程详解: 1.输入SQL语句 2.词法分析------flex 使用词法分析器(由Flex生成)将 SQL 语句分解为一个个单词,这些单词被称为“标记“。标记包括关键字、标识符、运算符、分隔符等。 2.1 flex 原…

clion2020.3配置clang-format

标题clion 启用clang-format 文件->设置->编辑器->代码样式. 为了保持原有代码风格不变,可以把原始的配置风格先导出,最好直接保存到自己的工程下,.clang-format是隐藏文件,需要用ctrlH才能看到 文件->设置->编辑…

用Node.js吭哧吭哧撸一个运动主页

简单唠唠 某乎问题:人这一生,应该养成哪些好习惯? 问题链接:https://www.zhihu.com/question/460674063 如果我来回答肯定会有定期运动的字眼。 平日里也有煅练的习惯,时间久了后一直想把运动数据公开,…

SpringBoot基于Zookeeper实现分布式锁

文章目录 问题背景前言实现搭建Zookeeper容器引入依赖ZK客户端的配置类ZK客户端的工厂类注入bean构建测试类 问题背景 研究分布式锁,基于ZK实现,需要整合到SpringBoot使用 前言 参考自SpringBoot集成Curator实现Zookeeper基本操作,Zookeeper入…

地理数据的双重呈现:GIS与数据可视化

前一篇文章带大家了解了GIS与三维GIS的关系,本文就GIS话题带大家一起探讨一下GIS和数据可视化之间的关系。 GIS(地理信息系统)和数据可视化在地理信息科学领域扮演着重要的角色,它们之间密切相关且相互增强。GIS是一种用于采集、…

Scrum敏捷模型的三个角色!如何在线绘制Scrum敏捷模型图?

1. 什么是Scrum敏捷模型? Scrum是一种敏捷开发方法,用于管理和组织软件开发项目。它强调团队的自组织和迭代式开发,通过不断的反馈和调整来快速交付高质量的软件产品。 Scrum敏捷模型将项目分解为一系列短期的迭代周期,每一个…

【量化课程】08_1.机器学习量化策略基础实战

文章目录 1. 常用机器学习模型1.1 回归模型1.2 分类模型1.2.1 SVC介绍1.2.2 SVC在量化策略中的应用 2. 机器学习量化策略实现的基本步骤3. 策略实现 1. 常用机器学习模型 1.1 回归模型 线性回归多层感知器回归自适应提升树回归随机森林回归 1.2 分类模型 线性分类支持向量机…

虹科方案 | 汽车总线协议转换解决方案(二)

上期说到,虹科的PCAN-LIN网关在CAN、LIN总线转换方面有显著的作用,尤其是为BMS电池通信的测试提供了优秀的解决方案。假如您感兴趣,可以点击文末相关链接进行回顾! 而今天,虹科将继续给大家带来Router系列在各个领域的…

【Linux操作系统】编译过程中遇到的问题-为什么加-c?执行文件提示无法执行二进制文件?main函数参数argc和*argv[]的作用和理解?

在使用GCC编译器进行程序开发时,我们经常会遇到一些编译过程中的问题, 比如为什么要加上"-c"选项,以及为什么生成的可执行文件无法执行等问题。 本篇博客将详细介绍这些问题,并给出相应的代码和解释,帮助读者…

Python web实战之Django的AJAX支持详解

关键词:Web开发、Django、AJAX、前端交互、动态网页 今天和大家分享Django的AJAX支持。AJAX可实现在网页上动态加载内容、无刷新更新数据的需求。 1. AJAX简介 AJAX(Asynchronous JavaScript and XML)是一种在网页上实现异步通信的技术。通过…

20230814让惠普(HP)锐14 新AMD锐龙电脑不联网进WIN11进系统

20230814让惠普(HP)锐14 新AMD锐龙电脑不联网进WIN11进系统 2023/8/14 17:19 win11系统无法跳过联网 https://www.xpwin7.com/jiaocheng/28499.html Win11开机联网跳过不了怎么办?Win11开机联网跳过不了解决方法 Win11开机联网跳过不了怎么办?Win11开机…

8.14 ARM

1.练习一 .text 文本段 .global _start 声明一个_start函数入口 _start: _start标签,相当于C语言中函数mov r0,#0x2mov r1,#0x3cmp r0,r1beq stopsubhi r0,r0,r1subcc r1,r1,r0stop: stop标签,相当于C语言中函数b stop 跳转到stop标签下的第一条…

HCIP-OpenStack

1、OpenStack概述 OpenStack是一种云操作系统,OpenStack是虚拟机、裸金属和容器的云基础架构。可控制整个数据中心的大型计算、存储和网络资源池,所有资源都通过API或Web界面进行管理。 为什么称OpenStack是云操作系统? 云一般指云计算&…

【MySQL--->数据类型】

文章目录 [TOC](文章目录) 一、数据类型分类二、整型类型三、bit(位)类型四、float类型五、decimal类型六、char和varchar类型1.char类型2.varchar3.char与varchar的区别 七、日期与时间类型八、enum和set 一、数据类型分类 二、整型类型 数值类型有数据存储上限,而且每个类型都…

C语言暑假刷题冲刺篇——day1

目录 一、选择题 二、编程题 🎈个人主页:库库的里昂 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏✨收录专栏:C语言每日一练 ✨其他专栏:代码小游戏C语言初阶🤝希望作者的文章能对你…

【计算机视觉|生成对抗】改进的生成对抗网络(GANs)训练技术

本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 标题:Improved Techniques for Training GANs 链接:[1606.03498v1] Improved Techniques for Training GANs (arxiv.org) 摘要 本文介绍了一系列应用于生成对抗网络(G…

数据可视化工具的三大类报表制作流程分享

电脑(pc)、移动、大屏三大类型的BI数据可视化报表制作步骤基本相同,差别就在于尺寸调整和具体的报表布局。这对于采用点击、拖拉拽方式来制作报表的奥威BI数据可视化工具来说就显得特别简单。接下来,我们就一起看看不这三大类型的…