序列化及方式对比分析

什么是序列化和反序列化?

如果需要持久化Java对象比如将Java对象保存在文件中, 或在网络传输Java对象, 这些场景需要使用到序列化.

序列化

将数据结构或对象转化成二进制字节流的过程

反序列化

将在序列化过程中所产生的二进制字节流转换成数据结构或者对象的过程

目的

序列化的主要目的是 通过网络传输对象 或者是将 对象存储到文件系统,数据库或内存 中.

常见序列化协议

JDK自带的序列化方式,因为序列化效率低而且存在安全问题, 一般不会使用.

像JSON和XML这种属于文本类序列化方式, 虽然可读性好, 但是性能较差, 一般不会选择

常用的基于二进制序列化协议有: Hessian, Kryo, Protobuf, ProtoStuff

JDK 自带的序列化方式

JDK自带的序列化, 只需要实现java.io.Serializable接口即可, 如下所示:

/*** @author 花木凋零成兰* @title SerializableTest* @date 2024/4/26 16:41* @package com.example.demo.demo1* @description 测试JDK的序列化方式*/
public class SerializableTest implements Serializable {private static final long serialVersionUID = 1L;private String filed1;private String[] filed2;private Object parameters;
}

serialVersionUID有什么作用呢?

主要用于版本控制, 反序列化时, 会检查serialVersionUID是否符合与当前类的serialVersionUID一致, 不一致则会抛出InvalidClassException异常

推荐每个序列化类都手动指定其serialVersionUID, 如果不手动指定, 则编译器会动态生成默认的serialVersionUID

serialVersionUID不是被static修饰了吗? 为什么还会序列化?

static修饰的变量是静态变量, 位于方法区, 本身不会被序列化, 但是serialVersionUID的序列化做了特殊处理, 序列化时, 会将其序列化到二进制字节流中, 在反序列化时也会解析并做一致性判断

即, serialVersionUID只是用来被JVM识别, 实际并没有被序列化

有些字段并不想序列化怎么办?

对于不想序列化的字段, 可以使用transient关键字修饰; 其作为为: 阻止实例中用此关键字修饰的变量序列化, 对象被反序列化时, 被该关键字修饰的变量值不会被持久化和恢复

关于transient注意:

  • 只能修饰变量, 不能修饰类和方法
  • 修饰的变量, 在被反序列化后变量值会被置成变量类型的默认值, 例如,修饰int类型, 那么反序列化后结果就是0
  • static变量,因为不属于任何对象, 所以无论有无transient关键字修饰, 都不会被序列化

为什么不推荐使用JDK序列化

  • 不支持跨语言调用
  • 性能差; 序列化后的字节数组体积较大, 传输成本加大
  • 存在安全问题

Kryo

是一个高性能的序列化/反序列化工具, 由于其变长存储特性并使用了字节码生成机制, 拥有较高的运行速度和较小的字节码体积

另外, Kryo序列化实现趋于成熟, 且在多个著名开源项目中广泛使用

github地址

使用示例如下:

/*** @author 花木凋零成兰* @title HelloKryo* @date 2024/4/26 17:14* @package com.example.demo.demo1* @description 尝试Kryo序列化*/
public class HelloKryo {static public void main (String[] args) throws Exception {// 创建Kryo实例Kryo kryo = new Kryo();// 使用register方法注册一个类SomeClass 让Kryo知道应该序列化的类kryo.register(SomeClass.class);// 创建SomeClass实例SomeClass object = new SomeClass();object.value = "Hello Kryo!";// 创建文件路径对象 且文件名为file.binPath path = Paths.get("file.bin");// 创建输出对象 用于写入序列化数据// Files.newOutputStream(path) 打开输出流 用于写入指定路径的文件Output output = new Output(Files.newOutputStream(path));// 将object序列化后的二进制数据 写入到output流中kryo.writeObject(output, object);// 关闭output流output.close();// 创建输入对象 读取序列化数据Input input = new Input(Files.newInputStream(path));// 将读取的二进制数据 反序列化为SomeClass对象实例SomeClass object2 = kryo.readObject(input, SomeClass.class);System.out.println(object2.value);// 关闭输入读取流input.close();}static public class SomeClass {String value;}
}

Protobuf

出自于Google, 性能比较优秀, 支持多种语言和跨平台, 但是使用过于繁琐, 需要自定义 LDL 文件和生成对应的序列化代码, 不够灵活, 但是也保证了没有序列化漏洞的风险

github地址

ProtoStuff

ProtoStuff 基于 Google Protobuf, 提供了更多的功能和更简易的用法, 同时性能也很优秀

github地址

Hessian

是轻量级,自定义描述的二进制RPC协议, 支持跨语言, 但是是比较老的序列化实现

总结

Kryo是专门针对Java语言序列化方式其性能非常好,所以推荐使用Kryo来作为序列化方式,

参考

https://github.com/Snailclimb/guide-rpc-framework

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

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

相关文章

PPSSPPSDL for Mac v1.17.1 PSP游戏模拟器(附500款游戏) 激活版

PPSSPPSDL for Mac是一款模拟器软件,它允许用户在Mac上运行PSP(PlayStation Portable)游戏。通过这款模拟器,用户可以体验到高清甚至更高的分辨率的游戏画面,同时还能够升级纹理以提升清晰度,并启用后处理着…

vite和webpacke的常规配置

文章目录 1、vite和webpacke的区分2、vite的常规配置介绍主要部分介绍vite基本配置示例 3、webpacke的常规配置介绍主要部分介绍Webpack 基本配置示例 1、vite和webpacke的区分 相同点: 都是构建工具,用于资源打包 ; 都有应用到摇树原理 tre…

[Diffusion Model 笔记]DDIM 笔记 数学推导 Denoising Diffusion Implicit Models

目录 核心总结符号定义第一套,快速简单讲清采样方法继续分析,待定系数法求解图示理解关于参数sigma 本文是观看以下视频的笔记,强烈推荐观看最后的图示理解: https://www.bilibili.com/video/BV13P411J7dm/?spm_id_from333.788 论…

路由重分布的概念与配置

路由重分布的概念 l 路由重分布是指连接不同路由域(自治系统)的边界路由器,它在路由协议之间交换和通告路由信息 从一种协议(含静态/直连路由)到另一种协议 同一种协议的多个实例 路由重分布的背景 网络出口位置…

时间序列预测:基于PyTorch框架的循环神经网络(RNN)实现销量预测

之前随手一写,没想到做预测的同学还挺多,但是之前那个效果并不好,于是在之前的基础上重新修改完善,到了现在这一步才感觉预测算是初步能应用。 上文地址:LSTM模型预测时间序列:根据历史销量数据预测商品未…

AI预测福彩3D第9套算法实战化测试第4弹2024年4月26日第4次测试

今天继续进行新算法的测试,今天是第4次测试。好了,废话不多说了,直接上图上结果。 2024年4月26日福彩3D预测结果 6码定位方案如下: 百位:4、5、7、8、3、9 十位:6、9、5、4、1、2 个位:7、8、5、…

光明的未来:光分路器在现代通信中的角色

光分路器又叫分光器,是一种集成波导光功率分配器件,作用是实现光信号的分路。例如,一个1x4光分路器可以将一路输入光信号等比分成四路输出光信号,并在四个不同的通道内进行传输。如今,光分路器广泛应用在无源光网络&am…

从 RAG 1.0到RAG 2.0,这次做对了什么?

RAG是目前最流行的补充生成式人工智能模型的方式,最近 RAG 的开创者提出了新的上下文语言模型 (CLM) ,他们称之为“ RAG 2.0 ”。 今天让我们一块来从RAG目前的原理和缺点出发,看看他们所提出的RAG2.0是否能够为行业带来新的希望。 LLM的时间…

提交链码-编辑前后端,调用链码功能

一 . 链码介绍 1.什么链码? • 链码是一段用 Go、Node.js 或者 Java 实现了规定接口的程序。链码在安全的Docker容器中运行, 与背书节点的进程隔离。通过应用程序提交的交易,链码初始化和管理账本状态。• 链码通常处理网络成员协商达成的业…

若依文件下载

后端自带工具controller package com.ruoyi.web.controller.common;import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.Logger…

docker常用基本命令

把jar包和 dockerfile文件放到同一目录下#构建Docker镜像 注意后面的 . 不能省略 docker build -t your-image-name .#运行并创建一个容器 docker run -d -p 8080:8080 --name container_name your-image-name# 停止容器 767fce4cb990 容器ID (容器名也可以) docker stop 767f…

HarmonyOS开发案例:【rating组件】

介绍 将引导开发者使用rating组件实现星级打分功能。 相关概念 [rating组件]:评分条,可根据用户判断进行打分。 环境搭建 软件要求 [DevEco Studio]版本:DevEco Studio 3.1 Release及以上版本。OpenHarmony SDK版本:API vers…

sCrypt全新上线RUNES功能

sCrypt智能合约平台全新上线一键etch/mint RUNES功能! 请访问 https://runes.scrypt.io/ 或点击阅读原文体验! 关于sCrypt sCrypt是BSV区块链上的一种智能合约高级语言。比特币使用基于堆栈的Script语言来支持智能合约,但是用原生Script编…

宁盾LDAP统一用户认证与单点登录:构建高效安全的企业身份认证

在信息化时代,企业面临着众多的应用系统和数据资源,如何有效地管理和保护这些资源,确保信息安全和高效利用,成为了企业信息化建设的核心问题。LDAP统一用户认证和单点登录(SSO)作为一种高效、安全的身份验证…

Quarto Dashboards 教程 2:Dashboard Layout

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度,分享官方文档的中文教程。软件可能随时更新,建议配合官方文档一起阅读。推荐先按顺序阅读往期内容: 1.quarto 教程 1:Hello, Quarto 2.qu…

srpingMVC基本使用

文章目录 1. springMVC基本功能(1) maven坐标导入(2) 编写表现层(3) springMVC配置类编写(4) 部署tomcat访问 2. 各种请求方法get请求post请求put请求delete请求请求参数提取 3. 请求参数接收(1) param参数接受封装到对象中 (2) 路劲参数接收集合接受时间类型接收json参数接收m…

1.C++入门(上)

目录 1.C关键字 2.命名空间 作用域方面的优化 a.命名空间定义 b.命名空间使用 3.C 输入&输出 1.C关键字 C有63个关键字,C语言有32个关键字,存在重叠如荧光笔标出 2.命名空间 作用域方面的优化 如果变量,函数和类的名称都存在于全…

java 词法分析练习

import parser.Parser;import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Main {public static void main(String[] args) {// 关键词List<String> keyList new ArrayList<>(Arrays.asList("int","String…

鸿蒙APP开发页面组件之间的属性关系

我们将对于多页面以及更多有趣的功能展开叙述&#xff0c;这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式&#xff08;UiAbility&#xff09;&#xff0c;样式的书写、状态管理以及动画等方面进行探讨 页面之间…

mac 教程 终端如何拆墙

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…