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

news2024/11/24 19:16:23

目录

为什么要进行序列化呢?

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


为什么要进行序列化呢?


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

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


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

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,最终就写入到了 ByteArrayOutputStream
                objectOutputStream.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.coloradmin.cn/o/879342.html

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

相关文章

Web安全:中间件漏洞

中间件一般指的是IIS、Apache、Nginx、Tomcat及Weblogic等一系列Web服务器中间件。中间件存在漏洞会直接威胁Web服务器代码及后台数据库的安全。 以前出现过的中间件漏洞一般是文件解析漏洞,例如IIS文件解析漏洞、Apache文件解析漏洞及Nginx文件解析漏洞等。如今我…

大模型时代和传统机器学习时代工具栈侧重点有所不同

大模型时代和传统机器学习时代工具栈侧重点有所不同 本章从企业训练模型、构建AI赋能应用的工作流视角出发,详解涉及的主要环节,并关注LLMOps和MLOps在流程上的侧重点差异。我们认为AI = Data + Code,历经数据准备、模型训练、模型部署、产品整合,分环节看: ► 数据准…

服务器安全防御要注意哪些方面?

服务器安全是我们每个互联网公司都应该做好的一个环节,每个互联网公司都会涉及到信息数据安全,而这些数据信息一般存放的地方都是在服务器,如果服务器受到破坏,我们的数据信息将会受到侵犯届时将会造成不可挽回的损失,…

三维模型OSGB格式轻量化在网络传输中的重要性探讨

三维模型OSGB格式轻量化在网络传输中的重要性探讨 随着三维模型应用的不断增加,网络传输成为了将三维模型从一个地方传输到另一个地方的主要方式。在网络传输中,数据量越大,传输速度就越慢,因此轻量化OSGB格式的三维模型数据在网络…

C#_详解浮点数类型特征

浮点数 浮点数基础 float double decimal 浮点数示例 float f; double d; decimal m;//①超过精度位数,数字无效 f 1234567890f; Console.WriteLine("f {0}",f);//f 1.234568E09//②再赋给更大精度度量,不能恢复数字 d f; Console.Write…

excel入门

上下左右移动 enter:换行,向下移动 shiftenter:向上移动 tab:向右移动 shifttab:向左移动 合并居中操作 开始-》合并居中 CtrlM 内容过长盖过了下一个单元格内容 双击列与列之间线 同时修改多行或者多列宽度或者高度 修改单行高度宽度 选中某一行拉取指定高…

Stable Diffusion基础:ControlNet之图片高仿效果

今天继续给大家分享AI绘画中 ControlNet 的强大功能,本次的主角是 Reference,它可以将参照图片的风格迁移到新生成的图片中,这句话理解起来很困难,我们将通过几个实例来加深体会,比如照片转二次元风格、名画改造、AI减…

C#字符串占位符替换

using System;namespace myprog {class test{static void Main(string[] args){string str1 string.Format("{0}今年{1}岁,身高{2}cm,月收入{3}元;", "小李", 23, 177, 5000);Console.WriteLine(str1);Console.ReadKey(…

一百五十三、Kettle——Linux上安装的kettle9.3启动后说缺少libwebkitgtk-1.0(真是坑爹啊,刚龟速下载又忍痛卸载)

一、问题 在kettle9.3可以在本地连接hive312后,在Linux中安装了kettle9.3,结果启动时报错WARNING: no libwebkitgtk-1.0 detected, some features will be unavailable 而且如果直接下载libwebkitgtk的话也没有用 [roothurys22 data-integration]# yu…

C#软件外包开发流程

C# 是一种由微软开发的多范式编程语言,常用于开发各种类型的应用程序,从桌面应用程序到移动应用程序和Web应用程序。下面和大家分享 C# 编程学习流程,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司&#…

基于灰狼算法改进深度信念网络的分类预测,gwo-dbn分类预测

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) 灰狼算法原理 灰狼算法改进深度信念网络的分类预测 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,是一种非常好的分类算法,本文…

【Python】进阶之 MySQL入门教程

文章目录 数据库概述Mysql概述Mysql安装与使用Navicat安装和使用Mysql终端指令操作Mysql和python交互订单管理案例实现 数据库概述 数据库的由来 发展历程说明人工管理阶段用纸带等进行数据的存储文件系统阶段数据存储在文件中数据库阶段解决了文件系统问题高级数据库阶段分布式…

生成式 AI 在泛娱乐行业的应用场景实践 – 助力风格化视频内容创作

感谢大家阅读《生成式 AI 行业解决方案指南》系列博客,全系列分为 4 篇,将为大家系统地介绍生成式 AI 解决方案指南及其在电商、游戏、泛娱乐行业中的典型场景及应用实践。目录如下: 《生成式 AI 行业解决方案指南与部署指南》《生成式 AI 在…

ios swift5 collectionView 瀑布流(两列)

文章目录 1.瀑布流1.1 demo地址1.2 记得把部署的最低版本由8改成11,13甚至更高。不然编译会报错 2.动态计算图片和文字的高度 1.瀑布流 1.1 demo地址 CollectionViewWaterfallLayout - github 1.2 记得把部署的最低版本由8改成11,13甚至更高。不然编译会报错 2.动态计算图片和…

Fiddler模拟请求发送和修改响应数据

fiddler模拟伪造请求 方法一:打断点模拟HTTP请求 1、浏览器页面填好内容后(不要操作提交),打开fiddler,设置请求前断点,点击菜单fiddler,”Rules”\”Automatic Breakpoints”\”Before Requests” 2、在…

3.文件目录

第四章 文件管理 3.文件目录 ​   对于D盘这个根目录来说它对应的目录文件就是图中的样子,其实就是用一个所谓的目录表来表示这个目录下面存放了哪些东西。在D盘中的每一个文件,每一个文件夹都会对应这个目录表中的一个表项,所以其实这些一…

魔改 axuanup 的 aardio和python 猜拳游戏 代码

根据 axuanup 的 aardio和python 猜拳游戏 代码,魔改了一个风格不一样的代码。 争取做到代码尽量“简”,但还没到“变态简”的程度,因为还能看懂。 原文:aardio和python 猜拳游戏-自由交流乐园-Aardio资源网 代码如下&#xff…

Java课题笔记~ 过滤器

概念 过滤器:顾名思义,就是在源数据和目的数据之间起过滤作用的中间组件。 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。 filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放…

使用VLC轻松体验本地视频推流、拉流、播放功能

VLC 前言一、VLC是什么?二、VLC推流(服务器推流)VLC客户端拉流参考 前言 本章主要讲解如何通过VLC开源免费工具对本地视频实现推流、拉流、播放演示。 一、VLC是什么? VLC 是一款自由、开源的跨平台多媒体播放器及框架&#xf…

.netcore grpc双向流方法详解

一、双向流处理概述 简单来讲客户端可以向服务端发送消息流,服务端也可以向客户端传输响应流,即客户端和服务端可以互相通讯客户端无需发送消息即可开始双向流式处理调用 。 客户端可选择使用 RequestStream.WriteAsync 发送消息。 使用 ResponseStream…