使用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.hqwc.cn/news/699990.html

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

相关文章

iOS——runtime

什么是runtime 我们都知道&#xff0c;将源代码转换为可执行的程序&#xff0c;通常要经过三个步骤&#xff1a;编译、链接、运行。 C 语言 作为一门静态类语言&#xff0c;在编译阶段就已经确定了所有变量的数据类型&#xff0c;同时也确定好了要调用的函数&#xff0c;以及函…

mysql主从热备部署

1、主从复制原理 mysql之间数据复制的基础是二进制日志文件。一台mysql数据库一旦开启用日志文件后&#xff0c;其作为master&#xff0c;它的数据库所有操作都会以事件的方式记录在二进制日志中&#xff0c;其他数据库作为slave通过一个I/O线程与主数据库保持通信&#xff0c;…

OpenAI 发布新款大型语言模型 GPT-4o,带大家了解最新ChatGPT动态。

OpenAI 发布新款大型语言模型 GPT-4o 昨日OpenAI 举办了一场线上活动&#xff0c;正式发布了其最新研发的 AI 模型 GPT-4o&#xff0c;并详细介绍了该模型的强大功能和未来发展规划。此次发布标志着 AI 技术的重大突破&#xff0c;为用户提供了更加便捷、高效的 AI 工具&#…

MySQL创建索引报错 Specified key was too long;max key length is 1000 bytes.

MySQL对创建索引的大小有限制&#xff0c;一般索引键最大长度总和不能超过1000个字节。 问题描述 MySQL创建索引时报错 Specified key was too long;max key length is 1000 bytes. 解决办法 (1) 修改存储引擎 InnoDB的索引字段长度限制大于MyISAM&#xff0c;可以尝试改成…

Pytorch学习-引言

Pytorch相关链接 Pytorch官方网站 https://pytorch.org/ Pytorch的Github仓库 https://github.com/pytorch/pytorch Pytorch论坛 https://discuss.pytorch.org/ Pytorch离线下载包链接 https://download.pytorch.org/whl/torch_stable.html Pytorch学习视频推荐链接 http://【…

记一次跨域问题

线上跨域问题&#xff0c;在自己配置确认没问题下&#xff0c;要及时找运维看看是不是nginx配置问题。 两个方面&#xff1a; 项目代码 nginx配置 SpringBoot 解决跨域问题的 5 种方案&#xff01; SpringBoot解决CORS跨域问题 SpringBoot-实现CORS跨域原理及解决方案

2024 年第一季度全球互联网中断事件

2024 年第一季度伊始&#xff0c;互联网发生了多起中断事件。陆地和海底电缆的损坏在多个地方造成了问题&#xff0c;而与持续中地缘政治冲突相关的军事行动影响了其他地区的连接。 几个非洲国家以及巴基斯坦的政府下令关闭互联网&#xff0c;主要针对移动网络连接。 被称为Ano…

【机器学习】逻辑回归:智能垃圾邮件分类实例

逻辑回归&#xff1a;智能垃圾邮件分类的利器 一、引言二、逻辑回归概述三、垃圾邮件分类实例数据准备特征选择与建模 四、总结与展望 一、引言 随着互联网的迅猛发展&#xff0c;电子邮件已成为人们日常生活和工作中不可或缺的一部分。然而&#xff0c;与此同时&#xff0c;垃…

IDEA报错:java 找不到符号

IDEA报错:java 找不到符号,代码没问题,IDEA缓存也清理了也重新构建了就是不行 最后使用终极大法 -Djps.track.ap.dependenciesfalse

1146 -Table ‘performance schema.session variables‘ doesn‘t exist的错误解决

一、问题出现 今天在本地连数据库的时候&#xff0c;发现这个问题&#xff0c;哎呦我擦&#xff0c;差点吓死了 二、解决办法 1&#xff09;找文件 用everything搜一下MySQL Server 5.7 然后去Windows服务找一下MySQL配置文件的具体路径 如果知道那最好&#xff0c;不知道那…

Leaflet系列——【一】初识Leaflet与Leaflet视图操作

初识Leaflet&#xff08;vue3 &#xff09; 前言&#xff1a;当你熟悉了openlayer、mapbox、cesium等一些GIS框架之后&#xff0c;对于我们开发来说其实他们的本质就是往瓦片上面叠加图层、【点、线、面、瓦片、geoJson、热力图、图片、svg等等】都是一层层的Layer图层&#xf…