使用java.io库序列化Java对象

在我们使用诸如Redis这类缓存系统时,我们往往会存在如下需求:将Java对象保存到Redis缓存中,然后在其他机器上还原回来。

Json方案

我们可以引入Json库等方式,将Java对象序列化为Json字符串来实现这个目的,但是这样的方案还是过于复杂。因为对于二进制类型数据,我们需要通过Base64之类的字符转换方式将其变成Json可以存储的字符串类型。反序列化时,又要Base64反解。这过程非常繁琐而且严重影响整体的效率。
在这里插入图片描述
在这里插入图片描述

二进制方案

实际我们可以使用java.io库中相关类,直接将Java对象转换为二进制;还可以直接通过加载二进制数据重新构建该对象。并且这个操作支持数组、List、Set、Map等非基础类型
在这里插入图片描述
直接上代码

核心代码

package org.serialize.serializer;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class MemorySerialize {public static <T> byte[] serialize(T obj) throws Exception {ByteArrayOutputStream bos = new ByteArrayOutputStream();try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {oos.writeObject(obj);return bos.toByteArray();}}public static <T> T deserialize(byte[] data) throws Exception {ByteArrayInputStream bis = new ByteArrayInputStream(data);try( ObjectInputStream ois = new ObjectInputStream(bis)) {@SuppressWarnings("unchecked")T obj = (T) ois.readObject();  return obj;}}
}

测试代码

数据类

下面的数据类包含了8种Java基础类型。
为了书写方便,我们使用了Data注解来帮我们生成诸如set/get类操作。
数据类需要继承于java.io.Serializable接口,否则生成操作会报错。

package org.serialize.pojo;import lombok.Data;@Data
public class BaseTypes implements java.io.Serializable{private byte byteValue;private short shortValue;private int intValue;private long longValue;private float floatValue;private double doubleValue;private char charValue;private boolean booleanValue;
}

Pom.xml

因为引入了lombok,并且需要写单元测试,所以在pom.xml中新增如下依赖。

        <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>RELEASE</version><scope>provided</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>test</scope></dependency>

测试代码

基础类型
    @Testpublic void testSerializeBaseTypes() {BaseTypes baseTypes = new BaseTypes();baseTypes.setByteValue((byte) 1);baseTypes.setShortValue((short) 2);baseTypes.setIntValue(3);baseTypes.setLongValue(4L);baseTypes.setFloatValue(5.0f);baseTypes.setDoubleValue(6.0);baseTypes.setCharValue('7');baseTypes.setBooleanValue(true);try {byte[] data = MemorySerialize.serialize(baseTypes);BaseTypes baseTypesDeserialized = MemorySerialize.deserialize(data);assertEquals(baseTypes, baseTypesDeserialized);} catch (Exception e) {e.printStackTrace();fail();}}
数组
@Testpublic void testSerializeBaseTypesArray() {BaseTypes[] baseTypesArray = new BaseTypes[3];for (int i = 0; i < baseTypesArray.length; i++) {BaseTypes baseTypes = new BaseTypes();baseTypes.setByteValue((byte) (i + 1));baseTypes.setShortValue((short) (i + 2));baseTypes.setIntValue(i + 3);baseTypes.setLongValue(i + 4L);baseTypes.setFloatValue(i + 5.0f);baseTypes.setDoubleValue(i + 6.0);baseTypes.setCharValue((char) (i + 7));baseTypes.setBooleanValue(i % 2 == 0);baseTypesArray[i] = baseTypes;}try {byte[] data = MemorySerialize.serialize(baseTypesArray);BaseTypes[] baseTypesArrayDeserialized = MemorySerialize.deserialize(data);assertArrayEquals(baseTypesArray, baseTypesArrayDeserialized);} catch (Exception e) {e.printStackTrace();fail();}}
List
    @Testpublic void testSerializeBaseTypesWithArrayList() {List<BaseTypes> baseTypesArrayList = new ArrayList<>();for (int i = 0; i < 3; i++) {BaseTypes baseTypes = new BaseTypes();baseTypes.setByteValue((byte) (i + 1));baseTypes.setShortValue((short) (i + 2));baseTypes.setIntValue(i + 3);baseTypes.setLongValue(i + 4L);baseTypes.setFloatValue(i + 5.0f);baseTypes.setDoubleValue(i + 6.0);baseTypes.setCharValue((char) (i + 7));baseTypes.setBooleanValue(i % 2 == 0);baseTypesArrayList.add(baseTypes);}try {byte[] data = MemorySerialize.serialize(baseTypesArrayList);List<BaseTypes> baseTypesArrayListDeserialized = MemorySerialize.deserialize(data);assertEquals(baseTypesArrayList, baseTypesArrayListDeserialized);} catch (Exception e) {e.printStackTrace();fail();}}
Set
    @Testpublic void testSerializeBaseTypesWithSet() {Set<BaseTypes> baseTypesSet = new HashSet<>();for (int i = 0; i < 3; i++) {BaseTypes baseTypes = new BaseTypes();baseTypes.setByteValue((byte) (i + 1));baseTypes.setShortValue((short) (i + 2));baseTypes.setIntValue(i + 3);baseTypes.setLongValue(i + 4L);baseTypes.setFloatValue(i + 5.0f);baseTypes.setDoubleValue(i + 6.0);baseTypes.setCharValue((char) (i + 7));baseTypes.setBooleanValue(i % 2 == 0);baseTypesSet.add(baseTypes);}try {byte[] data = MemorySerialize.serialize(baseTypesSet);Set<BaseTypes> baseTypesSetDeserialized = MemorySerialize.deserialize(data);assertEquals(baseTypesSet, baseTypesSetDeserialized);} catch (Exception e) {e.printStackTrace();fail();}}
Map
    @Testpublic void testSerializeBaseTypesWithMap() {Map<String, BaseTypes> baseTypesMap = new HashMap<>();for (int i = 0; i < 3; i++) {BaseTypes baseTypes = new BaseTypes();baseTypes.setByteValue((byte) (i + 1));baseTypes.setShortValue((short) (i + 2));baseTypes.setIntValue(i + 3);baseTypes.setLongValue(i + 4L);baseTypes.setFloatValue(i + 5.0f);baseTypes.setDoubleValue(i + 6.0);baseTypes.setCharValue((char) (i + 7));baseTypes.setBooleanValue(i % 2 == 0);baseTypesMap.put(String.valueOf(i), baseTypes);}try {byte[] data = MemorySerialize.serialize(baseTypesMap);Map<String, BaseTypes> baseTypesMapDeserialized = MemorySerialize.deserialize(data);assertEquals(baseTypesMap, baseTypesMapDeserialized);} catch (Exception e) {e.printStackTrace();fail();}}

文件方案

将Java对象直接保存到文件中,以及直接从文件中加载内容并转换为Java对象,可以使用java.io库中FileInputStream、FileOutputStream来实现。
在这里插入图片描述

核心代码

package org.serialize.serializer;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class FileSerialize {public static <T> void serialize(T obj, String fileName) throws Exception {try(FileOutputStream fos = new FileOutputStream(fileName)) {try(ObjectOutputStream oos = new ObjectOutputStream(fos)) {oos.writeObject(obj);oos.flush();}}}public static <T> T deserialize(String fileName) throws Exception {try (FileInputStream fis = new FileInputStream(fileName)) {try (ObjectInputStream ois = new ObjectInputStream(fis)) {@SuppressWarnings("unchecked")T obj = (T) ois.readObject();return obj;}}}}

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

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

相关文章

《四》系统模块整体功能关联与实现

在上一篇里&#xff0c;我们完成了动作的创建&#xff0c;那么这一次&#xff0c;我们把它加载到界面上&#xff0c;把需要是实现的动作都加上。 MyWord::MyWord(QWidget *parent): QMainWindow(parent) {mdiAreanew QMdiArea;mdiArea->setHorizontalScrollBarPolicy(Qt::S…

【Cesium解读】Cesium中primitive/entity贴地

官方案例 Cesium Sandcastle Cesium Sandcastle 好文推荐&#xff1a;Cesium贴地设置_primitive贴地-CSDN博客 scene.globe.depthTestAgainstTerrain true; True if primitives such as billboards, polylines, labels, etc. should be depth-tested against the terrain…

释放系统C盘的ext4.vhdx

ext4.vhdx 是个虚拟磁盘&#xff0c;默认位置为 C:\Users{用户名}\AppData\Local\Docker\wsl\data\ext4.vhdx&#xff0c;会占用很大磁盘空间&#xff0c;可采用下列办法将其改到其它磁盘或分区&#xff0c;如D分区。 1、查看有哪些&#xff1a; # wsl -l -vNAME …

静态代码扫描问题修复之--(输入验证 重定向[NodeJS])

问题描述: 当应用程序直接使用未经验证的用户输入来控制重定向URL时,存在安全隐患。攻击者可借此机会操纵输入,引导用户访问恶意网站,实施网络钓鱼等攻击。这在JavaScript前端代码及Node.js后端逻辑中均需警惕。 案例分析: 应用程序允许未验证的用户输入控制重定向中的UR…

MYSQL主从灾难恢复

方案背景 MySQL一主一从,当主库操作系统宕机无法启动,vip已漂移到从库,原从库成为主库单实例支撑业务。在新建主机上新建MySQL实例,配置为当前vip所在实例的从库,恢复MySQL一主一从。 2 恢复步骤 2.1 新建MySQL实例 2.1.1 解压安装包 #将二进制包上传至/usr/local/然后解…

Android Q - 音频通路调试

对于当前模块不是很清楚&#xff0c;刚好有个项目这方面有点问题&#xff0c;根据展锐支持文档一步步检查就可以了。首先得先弄清楚硬件具体是怎么连接的&#xff0c;比如文档提到的案例&#xff1a;sprd codec speaker output 连接外部 PA。 耳机接的是什么&#xff0c;speake…

C/C++关键字:extern

文章目录 一、extern&#xff1a;声明外部变量或外部函数1.extern的作用2.代码举例①例1②例2③例3 一、extern&#xff1a;声明外部变量或外部函数 1.extern的作用 extern的作用&#xff1a;声明外部的全局变量或外部的函数&#xff0c;以实现跨文件使用其他.c/.h文件的全局…

【Vue】vue项目中使用高德地图教程

在Vue项目中显示高德地图&#xff0c;你需要按照以下步骤进行 1. 注册高德开发者账号并获取API密钥2. 在Vue项目中引入高德地图API3. 在Vue组件中创建地图容器4. 在Vue组件中初始化地图5. 添加其他地图组件&#xff08;可选&#xff09;6. 处理地图事件&#xff08;可选&#x…

[链表专题]力扣82

1. 力扣82 : 删除排序链表中的重复元素 题 : 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。示例 1&#xff1a;输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5] 示例 …

【YOLO改进】换遍MMDET主干网络之Pyramid Vision Transformer(PVT)(基于MMYOLO)

Pyramid Vision Transformer&#xff08;PVT&#xff09; Pyramid Vision Transformer&#xff08;PVT&#xff09;是一种深度学习模型&#xff0c;它结合了Transformer架构和金字塔结构&#xff0c;旨在将Transformer的强大能力引入计算机视觉任务中&#xff0c;特别是那些需…

如何深入理解业务需求和业务流程?

要深入理解业务需求和业务流程&#xff0c;可以尝试以下方法&#xff1a; 1. 积极参与需求讨论&#xff1a;在相关会议中认真聆听&#xff0c;提出问题&#xff0c;与业务人员充分交流。 2. 研读业务文档&#xff1a;仔细分析业务规划、产品说明等文档&#xff0c;梳理出关键…

SQL练习题2.1

建表 # 学生表 create table t_student (stu_id varchar(10),stu_name varchar(10),stu_age datetime,stu_sex varchar(10) );# 课程表 create table t_t_course (c_id varchar(10),c_name varchar(10),c_teaid varchar(10) );# 教师表 create table t_t_teacher (tea…

C语言中数组与指针的区别

一. 简介 本文学习了 C语言中数组与指针的区别。这样的话&#xff0c;可以在编写C代码时规避掉出错的问题。 二. C语言中数组与指针的区别 1. 数组 定义字符串数组时&#xff0c;必须让编译器知道需要多少空间。 一种方法是用足够空间的数组存储字符串。例如如下&#xf…

DOM重点核心(注册事件+DOM事件流)

目录 1.注册事件 注册时间概述 addEventListener() 删除事件 2.DOM事件流 DOM事件流理论 事件对象 事件对象的常见属性和方法 e.targe 和 this的区别 阻止默认行为 阻止冒泡 事件委托 禁止右键菜单和禁止选中文字 获得鼠标的坐标&#xff08;可视区、页面、浏览器…

js原生弹框多选框

js原生弹框多选框 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>JavaS…

golang适配国产数据库

随着国产化的推进&#xff0c;越来越多的企业选择国产数据库替代mysql或者Oracle。 本篇主要介绍golang如何适配国产数据库 主流的国产数据库有达梦&#xff0c;金仓&#xff0c;神通&#xff0c;优炫&#xff0c;南大通用数据库等 前提环境 unixODBC安装 yum -y install un…

【深度学习实战(36)】模型转换之onnx模型转地平线J3 二进制bin模型

一、PTQ量化流程 &#xff08;1&#xff09; 核查onnx模型 &#xff08;2&#xff09;准备和生成模型校准数据集 &#xff08;3&#xff09;PTQ量化 &#xff08;4&#xff09;量化模型推理 二、具体流程 &#xff08;1&#xff09;使用01_check_onnx.sh脚本&#xff0c;对o…

Spring6 源码分析-ioc

&#xff08;1&#xff09;IDEA开发工具&#xff1a;2022.1.2 &#xff08;2&#xff09;JDK&#xff1a;Java17&#xff08;Spring6要求JDK最低版本是Java17&#xff09; &#xff08;3&#xff09;Spring&#xff1a;6.0.2 <dependencies><!--spring context依赖…

【教程】Linux/Jetson 安装X11VNC同步屏幕内容

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;请不吝给个[点赞、收藏、关注]哦~ 目录 背景说明 实际效果 安装步骤 安装 x11vnc 配置 x11vnc 配置 x11vnc 作为系统服务 使用 VNC 客户端连接 背景说明 通常vnc-server是单…

分享一个非常好用的安装包下载网站

当我们需要下载linux下的某些包,以便在自己的环境下进行编译自己的安装包的时候,可能需要用到一些各种版本的依赖包,从网上 百度会很麻烦。 这里分享一个很好用的安装包下载网站,记得点赞收藏 网站: Red Hat Enterprise Linux Repositories - pkgs.org 找到对应系统,然…