序列化及方式对比分析

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

如果需要持久化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.bin
        Path 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.mfbz.cn/a/577096.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 微信小程序 分享海报的实现

主页面 <template><view class"page"><!-- 自定义导航栏--><Navbar title"我的海报"></Navbar><view class"container"><poster ref"poster" :imageUrl"image" :imageWidth"7…

python之List列表

1. 高级数据类型 Python中的数据类型可以分为&#xff1a;数字型&#xff08;基本数据类型&#xff09;和非数字型&#xff08;高级数据类型&#xff09; 数字型包含&#xff1a;整型int、浮点型float、布尔型bool、复数型complex 非数字型包含&#xff1a;字符串str、列表l…

探索和构建 LLaMA 3 架构:深入探讨组件、编码和推理技术(四)分组多查询注意力

探索和构建 LLaMA 3 架构&#xff1a;深入探讨组件、编码和推理技术&#xff08;四&#xff09;分组多查询注意力 Grouped-query Attention&#xff0c;简称GQA 分组查询注意力&#xff08;Grouped-query Attention&#xff0c;简称GQA&#xff09;是多查询和多头注意力的插值…

【35分钟掌握金融风控策略10】风控策略部署2

目录 策略部署 决策引擎系统简介 基于决策引擎进行策略部署 策略部署结果验证 知识点补充 测试验证 回溯比对 策略部署 策略主要部署在决策引擎上进行风险决策&#xff0c;接下来分别介绍决策引擎系统&#xff0c;以及基于决策引擎进行策略部署的相关内容。 决策引擎系…

java-Spring-(MyBatis框架-xml管理)

目录 前置条件 xml与注解比较 1.1 xml定义 1.2 和SQL注解比较 建包准备 插入数据 ​编辑 更新数据 删除数据 查询数据 查看单字段查询 &#x1f3f7;&#x1f4a3;前置条件 创建一个spring boot 初始化的项目 &#x1f3f7;&#x1f4a3;xml与注解比较 1.1 xml定义 …

微信小程序简单实现购物车功能

微信小程序简单实现购物车结算和购物车列表展示功能 实现在微信小程序中对每一个购物车界面的商品订单&#xff0c;进行勾选结算和取消结算的功能&#xff0c;相关界面截图如下&#xff1a; 具体实现示例代码为&#xff1a; 1、js代码&#xff1a; Page({/*** 页面的初始数…

SpringCloudAlibaba:2.1nacos

概述 概述 简介 Nacos是阿里巴巴开源的服务注册中心以及配置中心 Nacos注册中心Eureka 服务配置Config 服务总线Bus 官网 Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 名字由来 Naming&#xff1a;名字 Configurations&#xff1a;配置 Service&#xff1a;服务 功能…

【基础篇】Git 基础命令与核心概念

✅作者简介&#xff1a;大家好&#xff0c;我是小杨 &#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; 一&#xff0c;Git 初识 1.1&#xff0c;问题引入 不知道你工作或学习时&#xff0c;有没有遇到…

Centos8操作系统安装mysql5.7版本以及报错解决

目录 一、卸载MySql 1.首先查看已安装的mysql 2.逐个或者执行一下命令统一卸载掉 注意&#xff1a; 3. 卸载其他相关文件 二、安装MySql 1.安装mysql的rpm源 2.安装MySql 如果遇到以下错误&#xff1a; 问题一: 解决方法&#xff1a; 问题二、 解决方法&#xff1…

国产麒麟v10系统下打包electron+vue程序,报错unknown output format set

报错如下&#xff1a; 报错第一时间想到可能是代码配置原因报错&#xff0c;查看代码似乎感觉没啥问题 又查看具体报错原因可能是因为icon的原因报错&#xff0c;后面查阅发现ico在各系统平台会不兼容&#xff0c;也就是ico是给win下使用的&#xff0c;此处改下图标格式就ok&am…

1、Qt简介

文章目录 前言一、pySide2 / pySide6 ,PyQt5 / PyQt6二、安装包1 安装pyside22 安装pyqt5三、从一个简单的例子开始三、界面动作处理---信号(signal)与槽(slot)(Qt最核心的机制)--- 绑定事件封装到类中总结前言 参考文章:Qt简介 本文开始就开始进入到qt的开发笔记书写…

【论文解读】QUEST: Query Stream for Practical Cooperative Perception

QUEST 摘要引言QUERY COOPERATION PARADIGMQUEST FRAMEWORKA. Overall ArchitectureB. Cross-agent Query Interaction 实验结论 摘要 合作感知通过提供额外的视点和扩展感知领域&#xff0c;可以有效地提高个体感知性能。现有的合作模式要么是可解释的(结果合作)&#xff0c;…

计算机视觉——OpenCV 使用分水岭算法进行图像分割

分水岭算法 分水岭算法&#xff1a;模拟地理形态的图像分割 分水岭算法通过模拟自然地形来实现图像中物体的分类。在这一过程中&#xff0c;每个像素的灰度值被视作其高度&#xff0c;灰度值较高的像素形成山脊&#xff0c;即分水岭&#xff0c;而二值化阈值则相当于水平面&am…

LabVIEW高效目标跟踪系统

LabVIEW高效目标跟踪系统 随着机器视觉技术的飞速发展&#xff0c;设计和实现高效的目标跟踪系统成为了众多领域关注的焦点。基于LabVIEW平台&#xff0c;结合NI Vision机器视觉库&#xff0c;开发了一种既高效又灵活的目标跟踪系统。通过面向对象编程方法和队列消息处理器程序…

以更多架构核心专利,推进 SDS 产业创新创造

今天是第 24 个世界知识产权日&#xff0c;今年世界知识产权日活动的主题是&#xff1a;“知识产权和可持续发展目标&#xff1a;立足创新创造&#xff0c;构建共同未来。” 这也正是 XSKY 在软件定义存储领域的目标之一。以“数据常青”为使命的 XSKY&#xff0c;始终立足于软…

济宁市中考报名照片要求及手机拍照采集证件照方法

随着中考报名季的到来&#xff0c;并且进入了中考报名演练阶段&#xff0c;济宁市的广大考生和家长都开始忙碌起来。报名过程中&#xff0c;上传一张符合要求的证件照是必不可少的环节。本文将详细介绍济宁市中考报名照片的具体要求&#xff0c;并提供一些实用的手机拍照采集证…

LeetCode in Python 74/240. Search a 2D Matrix I/II (搜索二维矩阵I/II)

搜索二维矩阵I其实可以转换为搜索一维数组&#xff0c;原因在于&#xff0c;只要先确定搜索的整数应该在哪一行&#xff0c;即可对该行进行二分查找。 搜索二维矩阵II中矩阵元素排列方式与I不同&#xff0c;但思想大致相同。 目录 LeetCode in Python 74. LeetCode in Pyth…

html表格导出为word文档,导出的部分表格内无法填写文字

导出技术实现&#xff1a;fileSaver.jshtml-docx-js 1.npm安装 npm install --save html-docx-js npm install --save file-saver 2.页面引入 import htmlDocx from html-docx-js/dist/html-docx; import saveAs from file-saver;components: {htmlDocx,saverFile, }, 3.页…

(MSFT.O)微软2024财年Q3营收619亿美元

在科技的浩渺宇宙中&#xff0c;一颗璀璨星辰再度闪耀其光芒——(MSFT.O)微软公司于2024财政年度第三季展现出惊人的财务表现&#xff0c;实现总营业收入达到令人咋舌的6190亿美元。这一辉煌成就不仅突显了微软作为全球技术领导者之一的地位&#xff0c;更引发了业界内外对这家…

Vue从0-1学会如何自定义封装v-指令

文章目录 介绍使用1. 理解指令2. 创建自定义指令3. 注册指令4. 使用自定义指令5. 自定义指令的钩子函数6. 传递参数和修饰符7. 总结 介绍 自定义封装 v-指令是 Vue.js 中非常强大的功能之一&#xff0c;它可以让我们扩展 Vue.js 的模板语法&#xff0c;为 HTML 元素添加自定义行…
最新文章