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

news2024/11/18 1:41:30

在我们使用诸如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>

测试代码

基础类型
    @Test
    public 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();
        }
    }
数组
@Test
    public 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
    @Test
    public 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
    @Test
    public 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
    @Test
    public 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.coloradmin.cn/o/1676043.html

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

相关文章

【JS面试题】this

this取什么值&#xff0c;是在函数执行的时候确定的&#xff0c;不是在函数定义的时候确定的&#xff01; this的6种使用场景&#xff1a; ① 在普通函数中使用&#xff1a;返回window对象 ② 使用call apply bind 调用&#xff1a;绑定的是哪个对象就返回哪个对象 ③ 在对象…

IP应用场景查询API接口

IP应用场景查询API接口指的是输入IP地址&#xff0c;查询IP应用场景信息。那么IP地址应用场景查询接口如何对接呢&#xff1f; 首先我们找到一家有IP地址应用场景查询API的服务商数脉API,然后注册账号&#xff0c;购买免费套餐 接下来就需要技术同学把IP应用场景查询接口对接到…

【线性系统理论】笔记一

一&#xff1a;状态空间表达式 电路系统状态空间描述列写 1&#xff1a;选取状态变量 状态变量定义&#xff1a;线性无关极大组属性。 2&#xff1a;列出电路原始回路方程 ps&#xff1a;状态变量有两个&#xff0c;理论上需要列写2个方程 3&#xff1a;规范形势 4&#xf…

比大小(打擂台)(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明比较大小函数max; int max(int a, int b);int main() {//初始化变量值&#xff1b;int i, n, m, a[10];//填充数组&#xff1b;printf("请输入10个数…

注意力机制篇 | YOLOv8改进之在C2f模块引入反向残差注意力模块iRMB | CVPR 2023

前言:Hello大家好,我是小哥谈。反向残差注意力模块iRMB是一种用于图像分类和目标检测的深度学习模块。它结合了反向残差和注意力机制的优点,能够有效地提高模型的性能。在iRMB中,反向残差指的是将原始的残差块进行反转,即将卷积操作和批量归一化操作放在了后面。这样做的好…

一台linux通过另一台linux访问互联网-TinyProxy

参考&#xff1a; https://blog.csdn.net/weixin_41831919/article/details/113061317https://www.yuncongz.com/archives/1.htmlhttps://blog.csdn.net/aoc68397/article/details/101893369 环境&#xff1a;ubuntu 18.04 机器1: IP 219.216.65.252 (可以访问外网) 机器2: IP…

下单制造fpc的工艺参数

FPC工艺简介 - 百度文库 (baidu.com) FPC工艺参数 - 豆丁网 (docin.com) FPC柔性线路板的主要参数.ppt (book118.com) 捷多邦&#xff1a; 华秋&#xff1a; 背胶&#xff1a; FPC板背胶是可以粘接在光滑表面的一种薄型胶带&#xff0c;可以在狭小以及光滑的表面上用来提供高…

【IDE】com.intellij.debugger.engine.evaluation.EvaluateException

目录标题 报错重现代码分析解决方式 报错重现 Error during generated code invocation com.intellij.debugger.engine.evaluation.EvaluateException: Method threw java.lang.NullPointerException exception.代码分析 //ls来自上下文 ls.stream().map(m->m.getRewardTy…

搞懂Docker(十)- 优化创建镜像

获取示例程序 示例程序 或者 示例程序 获取示例程序程序结构如下├── getting-started-app/ │ ├── package.json │ ├── README.md │ ├── spec/ │ ├── src/ │ └── yarn.lock优化创建镜像 使用docker image history命令,可以查看创建镜像里的每一层的信息…

Java面试八股文(SpringCloud篇)

****************************************************

AI大模型日报#0514:OpenAI GPT-4o震撼发布、我是如何赢得GPT-4提示工程大赛冠军的

导读&#xff1a;欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了今日要点以及每条资讯的摘要。《AI大模型日报》今日要点&#xff1a;OpenAI在春季新品发布会上推出全能模型GPT-4o及桌面App&#xff0c;颠覆科技界。GPT-4o…

很难找到全的!150个软件测试领域专业术语汇总

1. 单元测试&#xff08;Unit Testing&#xff09;&#xff1a;对软件中的最小功能单元&#xff08;通常是函数或方法&#xff09;进行测试&#xff0c;以验证其是否按预期工作。 2. 集成测试&#xff08;Integration Testing&#xff09;&#xff1a;测试不同模块之间的交互…

Linux内核发送网络数据

前言 我们开始今天对 Linux 内核⽹络发送过程的深度剖析。还是按照我们之前的传统&#xff0c;先从⼀段代码作为切⼊。 上述代码中&#xff0c;调⽤ send 之后内核是怎么样把数据包发送出去的。本⽂基于Linux 3.10&#xff0c;⽹卡驱动采⽤Intel的igb举例。 基础框架 我们看…

汇聚荣科技:拼多多开店没有流量应该怎么办?

拼多多开店没有流量是一个常见的问题&#xff0c;许多新手商家都会遇到这样的困境。那么&#xff0c;如何解决这个问题呢?下面从四个方面进行详细阐述。 一、优化店铺和商品 首先&#xff0c;要确保店铺和商品的质量。店铺要有自己独特的风格和特色&#xff0c;商品要有高质量…

windows平台Visual Studio2022编译libuvc调试usb摄像头

一、下载libuv源码&#xff0c;源码地址&#xff1a;libuvc/libuvc: a cross-platform library for USB video devices (github.com) 二、新建vs工程&#xff0c;将libuvc源码中的include和src目录下的文件拷贝到工程中。 1.include源码修改 ①libuvc头文件修改 将 #includ…

基于NIOS-II软核流水灯和串口通信实现

文章目录 一、创建工程二、系统设计1. 在 “component library” 标签栏中找到 “Nios II Processor” 后点击 Add2. 在 ”Component Library” 标签栏中的查找窗口输入 jtag 找到 ”JTAG UART ”&#xff0c;然后点击 Add3. 添加片上存储器 On-Chip Memory(RAM)核4. 查找窗口输…

ORA-00932: inconsistent datatypes: expected - got CLOB的分析解决方案

最近在项目中遇到查询数据时报ORA-00932: inconsistent datatypes: expected - got CLOB错误&#xff0c;这个错误很明显是由于查询时类型的不匹配造成的。 问题分析&#xff1a; 一、检查你的查询的实体的类型是否于数据库的保持一致&#xff0c;如果不一致&#xff0c;那么需…

eNSP PRO安装完整版(超详细)

目录 eNSP PRO包&#xff1a; 安装步骤&#xff1a; eNSP PRO包&#xff1a; 链接: https://pan.baidu.com/s/12oBJ708OHMZlhj8nS21HSw?pwdr64q 提取码: r64q 安装步骤&#xff1a; 将ensp pro的包下载并且解压出来 在Oracle VM VirtualBox&#xff0c;将我们解压好的en…

OpenAI 发布了免费的 GPT-4o,国内大模型还有哪些机会?

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 这是今天在某乎看到一个问题&#xff1a;OpenAI 发完 GPT-4o&…

电力系统潮流计算的计算机算法(一)——网络方程、功率方程和节点分类

本篇为本科课程《电力系统稳态分析》的笔记。 本篇为这一章的第一篇笔记。下一篇传送门。 实际中的大规模电力系统包含成百上千个节点、发电机组和负荷&#xff0c;网络是复杂的&#xff0c;需要建立复杂电力系统的同一潮流数学模型&#xff0c;借助计算机进行求解。 简介 …