序列化与反序列化深入理解

news2024/10/5 19:10:32

序列化与反序列化深入理解

  • 1 介绍
    • 1.1 概述
    • 1.2 序列化实现的需求
  • 2 常用序列化实现
    • 函数序列化
    • 语言内置
    • 开源序列化实现
  • 3 各序列化实现比较
  • 4 各序列化实现概述
    • XML
    • JSON
    • Protobuf
    • Java 内置
    • TLV
    • VLE(Variable Length Encoding)
  • 5 flex & bison
    • 5.1 介绍
    • 应用
      • 解释器
      • IDL
        • 介绍
        • IDL编译器
  • 参考

1 介绍

1.1 概述

  • 数据传输中,双方交互都需要对数据进行序列化和反序列化。也称为编码和解码。
  • 网络传输中,传输数据的基本形式就是二进制流,也就是一段一段的1和0。数据读取形式是字节,也就是Byte。具体粘包拆包后,是按字符串、结构体、JSON还是protobuf等形势序列化,看程序设计。
  • 结构化的数据与字节流之间的双向转换,将结构化数据转换成字节流的过程,称为序列化,反过来转换,就是反序列化。序列化的用途除了用于在网络上传输数据以外,另外一个重要用途是,将结构化数据保存在文件中。
  • 序列化无处不在:
    • CPU:数据被序列化成 little endian / big endian
    • GPU:vertex buffer
    • 内存:字节流
    • 磁盘/网络:JSON,YAML,MessagePack,protobuf,FlatBuffer,,以及所有的网络协议
      在这里插入图片描述

1.2 序列化实现的需求

  • 可读性:序列化后的数据最好是易于人类阅读的;
  • 复杂度:实现的复杂度是否足够低;
  • 性能水平:性能包括两个方面,时间复杂度和空间复杂度。序列化和反序列化的速度越快越好;空间开销(Verbosity)和时间开销(Complexity)都越小越好。
  • 信息密度:序列化后的信息密度越大越好,也就是说,同样的一个结构化数据,序列化之后占用的存储空间越小越好;
  • 通用性:技术层面,序列化协议是否支持跨平台、跨语言;流行程度,是否被大量使用;
  • 健壮性:是否稳定。

2 常用序列化实现

函数序列化

函数之间通过栈来交流:调用者把参数序列化到栈上,被调者将其反序列化出来。
在这里插入图片描述

语言内置

Java 和 Go 语言都内置了序列化实现。
Java 语言中提供的 Serializable 接口,此外还有 Android 提供的 Parcelable 接口。

开源序列化实现

Google 的 Protobuf、Kryo、Hessian 等;
此外,像 JSON、XML 这些标准的数据格式,也可以作为一种序列化实现来使用。

3 各序列化实现比较

序列化实现优点缺点备注
JSON可读性很好,使用简单信息密度很低文本
XML可读性很好,使用简单信息密度也很低文本,XML 所产生序列化之后文件比JSON大
SOAP可读性很好,使用简单信息密度也很低文本
Kryo适用范围广,使用简单信息密度稍高二进制序列化
Hessian适用范围广,使用简单信息密度稍高二进制序列化
protobuf信息密度高使用更复杂二进制序列化,可伸缩性的数据类型
java信息密度高语言内置二进制序列化,数据类型固定长度
TLV(Type-Length-Value)信息密度较高,容易解析自定义,通用差二进制序列化

4 各序列化实现概述

XML

XML 是一种常用的序列化和反序列化协议,具有跨机器,跨语言等优点。

JSON

JSON 起源于弱类型语言 Javascript, 它的产生来自于一种称之为"Associative array"的概念,其本质是就是采用"Attribute-value"的方式来描述对象。实际上在 Javascript 和 PHP 等弱类型语言中,类的描述方式就是 Associative array。
这是因为 JSON 是上下文极其相关的,在上一个 token 解析完成之前,你无法解析下一个 token,所以效率慢。

Protobuf

  • 序列化数据非常简洁,紧凑,与 XML 相比,其序列化之后的数据量约为 1/3 到 1/10。
  • 解析速度非常快,比对应的 XML 快约 20-100 倍。
  • 提供了非常友好的动态库,使用非常简介,反序列化只需要一行代码。
  • Protobuf 是非常高效的序列化协议。
  • Protobuf 提供了可伸缩性的数据类型(int 1-5字节)。

Java 内置

在这里插入图片描述
Java是数据类型固定长度的序列化(int 4字节, long 8字节)。

TLV

TLV: TLV是指由数据的类型Tag,数据的长度Length,数据的值Value组成的结构体,几乎可以描任意数据类型,TLV的Value也可以是一个TLV结构,正因为这种嵌套的特性,可以让我们用来包装协议的实现。
在这里插入图片描述

VLE(Variable Length Encoding)

Variable Length Encoding(VLE):Type 的长度和 Length 的长度都是可变的,且最常用的我们用最小的比特位为其序列化。比如 protobuf 就采用了 VLE 的方式。

message Person {
  string user_name = 1;
  int64 favorite_number = 2;
  string interests = 3;
}

因为 protobuf 定义的字段是可选的,所以这里光靠 TLV 还不够,还需要每个字段的 tag,这就是为什么 protobuf 需要为每个字段提供序号,并且序号不可重复
在这里插入图片描述

5 flex & bison

5.1 介绍

Flex and bison就是lex and yacc的升级版。Lex 代表 Lexical Analyzar。Yacc 代表 Yet Another Compiler Compiler。
Flex和bison是两个用来生成程序的工具,它们生成的程序分别叫做词法分析器和语法分析器。
在这里插入图片描述

在这里插入图片描述
Flex生成的词法分析器将输入拆分成一个个记号(token),bison生成的语法分析器根据已有的规则,分析这些token的组合,是否符合语法规范。
在这里插入图片描述
在这里插入图片描述

应用

解释器

各行业使用的解释器,如有的协作机械臂图形编程中解释器

IDL

介绍

IDL的全称是Interface Definition Language,即接口定义语言(有时也叫作接口描述语言)。因为RPC通常是跨进程、跨机器、跨系统和跨语言的,IDL是用来解决这个问题的,它与语言无关,借助编译器将它翻译成不同的编程语言。
Google开源的ProtoBuf中的“.proto”文件就是一种IDL文件。

IDL编译器

IDL中定义接口、函数和数据等,需要在发送前编码成字节流,在收到后进行解码。比如将函数名、参数类型和参数值等编码成字节流,然后发送给对端,然后对端进行解码,还原成函数调用。ProtoBuf就是一个非常好的编解码工具。

  • protobuf 中底层有用flex & bison
  • opensplice DDS中底层有用flex & bison
  • RTI DDS中底层有用flex & bison
  • Fast DDS中底层有用flex & bison

参考

1、linux–Flex and Bison
2、12 序列化与反序列化:如何通过网络传输结构化的数据?
3、网络传输 | 序列化与反序列化
4、序列化与反序列化:通过网络传输结构化的数据
5、数据传输过程的序列化,你了解吗
6、Protocol Buffer序列化对比Java序列化
7、佛曰:大道至简,序列化之
8、JSON概述
9、网络通信–协议设计
10、数据交换协议–JSON、XML、YAML、TOML、TLV
11、转–全图文分析:如何利用Google的protobuf,来思考、设计、实现自己的RPC框架
12、机器人开发–DDS数据分发服务
13、linux–解释器
14、GOOD–【RPC】RPC的实现—未研读

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

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

相关文章

MyBatis-4

MyBatis 工作原理 形式上的应用为&#xff1a; UserMapper userMapper MyBatisSessionFactory.getMapper(UserMapper.class); List<User> userList userMapper.selectByExample(example)真正执行的操作为: SqlSession session MyBatisSessionFactory.getSession();…

聊天更有趣ChatGPT【再次更新】第三方插件

ChatGPT再次更新&#xff0c;第三方插件让你的聊天更有趣 你是否曾经想过&#xff0c;如果你能够和你最喜欢的明星、作家或者历史人物聊天&#xff0c;会是什么样的体验&#xff1f;你是否曾经想过&#xff0c;如果你能够和你的朋友一起玩一些有趣的游戏、挑战或者测试&#x…

spring注解驱动开发(BEAN注册方式与生命周期)

目录 容器中注册BEAN的方式 BEAN生命周期 容器中注册BEAN的方式 包扫描组件标注注解 ComponentScan(basePackages {"com.an.spring.condition"}) Service Component Controller RepositoryBEan方式【导入第三方包里面的组件】 ComponentScan(basePackages {&quo…

chatgpt赋能python:Python处理雷达数据

Python处理雷达数据 雷达技术是一种主要用于测量目标距离、速度和方位的技术。在雷达系统中&#xff0c;雷达接收器接收到的信号经过一系列的处理才能得到有效的数据。在这一过程中&#xff0c;Python语言得到了广泛应用。本文将介绍Python如何处理雷达数据。 雷达数据的格式…

linuxOPS基础_ssh概念详解

ssh 什么是SSH SSH&#xff08;Secure Shell&#xff0c;安全外壳&#xff09;是一种网络安全协议&#xff0c;通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录和文件传输方式&#xff0c;例如Telnet、FTP&#xff0c;使用明文传输数据&#xff0c;存在很多…

Openlayers 教程 - 基于 Openlayers api 实现空间查询(客户端):点选、范围查询

Openlayers 教程 - 基于 Openlayers api 实现空间查询&#xff08;客户端&#xff09;&#xff1a;点选、范围查询 客户端空间查询核心代码在线示例 客户端空间查询 在地理信息系统中&#xff0c;空间查询有的非常重要的作用&#xff0c;几乎所有地图相关的业务系统都需要空间…

青少年C++编程等考有这么多??机构到底该带孩子考哪个?

随着信息学的普及与发展&#xff0c;越来越多的孩子开始学习C&#xff0c;参加编程等考来检验C的学习成果、作为也逐渐成为了一个共识&#xff0c;跟C有关的等考究竟有哪些&#xff0c;哪个等考含金量够高&#xff0c;能够客观、有效地检验学习成果呢&#xff1f; 在这里整理了…

解决Fortify漏洞:Access Specifier Manipulation

目录 1. 什么是Fortify漏洞 2. 漏洞描述 示例&#xff1a; 3. 漏洞原因 4. 解决方法 示例&#xff1a; 1. 什么是Fortify漏洞 Fortify 是一种静态代码分析工具&#xff0c;可用于识别源代码中的安全漏洞和错误。Fortify 检查程序是否存在潜在的安全漏洞&#xff0c;例如 …

Vue-springboot大学生心理健康测试咨询与诊断平台设计与实现

心理健康咨询与诊断平台一直以来就是困扰医院提高服务水平的重要环节&#xff0c;特别是医疗水平高、门诊访问量高的综合型医院&#xff0c;门诊拥挤就成了普遍现象。因此&#xff0c;本文提出了心理健康咨询与诊断平台。在线预约挂号、医疗诊断、医生评价、排班信息、心理测试…

WWW 2023 | 量化交易相关论文(附论文链接)

写在前面 国际万维网会议&#xff08;Proceedings of the ACM Web Conference&#xff0c;简称 WWW&#xff09;是互联网技术领域最重要的国际会议之一。今年的 WWW 将在美国德克萨斯州举行。本届会议共收到了1900篇论文&#xff0c;接收365篇&#xff0c;录用率为19.2%。本文介…

单片机的系统移植

目录 一、uboot概述 Bootloader Bootloader基本功能&#xff1a; 二、SD卡启动盘制作 三、uboot的使用 3.1uboot模式 自启动模式 交互模式 3.2uboot帮助命令 3.3uboot环境变量命令 3.4常用环境变量 3.5网络传输命令 3.6u-boot访问存储器命令 3.7 u-boot自启动环境变量&#xff…

web3到底是什么?只是一场永远醒不来的梦

Hello大家好&#xff0c;我是ClonBrowser鱼鱼。 过去&#xff0c;我一直与大家分享Facebook运营和广告方面的干货&#xff0c;但今天我想和大家聊聊一个更加炙手可热的话题——Web3。 近年来&#xff0c;Web3成为了互联网行业的热门关键词&#xff0c;被各大媒体和技术界热议…

体验管理|关于客户旅程编排(CJO),你不知道的事!

Guofu 第 97⭐️ 篇原创文章分享 &#xff08;点击&#x1f446;&#x1f3fb;上方卡片关注我&#xff0c;加⭐️星标⭐️~&#xff09; 客户旅程地图大家已经很熟悉了&#xff0c;那客户旅程编排又是什么呢&#xff1f; 我们一起来看一下。&#x1f47b;&#x1f47b;&#x1…

for循环中的变量

此处点击时打印的i为5 因为i本身onclick内部没有,需要去全局变量找 此处点击时打印的i为5 此处按按钮i打印4 // 对每一个按钮的点击进行监听for (var i 0; i < btnEls.length; i) {var btnItemEl btnEls[i]btnItemEl.index ibtnItemEl.onclick function() {console.log…

提高数据处理效率的有力工具:TopK算法解析

文章目录 TopK是什么TopK算法的实现总结 在现实生活中&#xff0c;TopK算法是非常常见的一种应用&#xff0c;你可能已经在电商平台上使用它来搜索最畅销的商品或者在音乐应用中使用它来发现最受欢迎的歌曲。那么&#xff0c;让我们深入了解TopK算法的原理和实现吧&#xff01;…

一维Logistic系统分岔图matlab实现

Logistic系统被广泛应用在各个领域中&#xff0c;如生态学、物理学和社会科学等&#xff0c;也被用于密码学和数据加密中。在工业和商业中&#xff0c;混沌Logistic系统也被用于数据编码和保密通信。Logistic系统是一种非常简单的二次多项式形式的映射。 混沌Logistic系统指的…

Centos7更换OpenSSL版本

OpenSSL 1.1.0 用户应升级至 1.1.0aOpenSSL 1.0.2 用户应升级至 1.0.2iOpenSSL 1.0.1 用户应升级至 1.0.1u 查看openssl版本 openssl version -v选择升级版本 我的版本是OpenSSL 1.0.2系列&#xff0c;所以要升级1.0.2i https://www.openssl.org/source/old/1.0.2/openssl-…

MATLAB 滤波器频率特性分析

【设计目标】对典型滤波器进行时频域分析和处理的基本方法 【设计工具】MATLAB 【设计要求】 1)设计典型的滤波电路:低通、高通、带通、带阻2)理论分析各滤波电路的系统函数 3)利用Matlab分析各滤波电路的系统函数的频率特性(幅频、相频)、零极点分布 4)分析不同频率正…

(iView)表格过长省略显示且提示

(iView)表格过长省略显示且提示 效果&#xff1a; 写法&#xff1a; data(){return:{ columns: [{type: "selection",align: "center",width: 60,},{title: "名称",key: "chinese",align: "center",ellipsis: true, //1.…

STM32模拟I2C协议获取HMC5883L电子罗盘磁角度数据 (HAL)

STM32模拟I2C协议获取HMC5883L电子罗盘磁角度数据(HAL) HMC5883L 传感器采用霍尼韦尔各向异性磁阻(AMR)技术&#xff0c;应用于罗盘和三轴磁场角度检测领域&#xff0c;常用于水平物体转动的角度识别。HMC5883L 采用I2C总线接口&#xff0c;2.16~3.6V供电范围&#xff0c;带有…