序列化和反序列化的认识【protobuf、json、xml】

1. 什么是序列化与反序列化?

  • 程序员在编写应用程序的时候往往需要将程序的某些数据存储在连续的内存中,然后将其写入文件或是将其传输到网络中的另一台计算机上以实现通讯。这个将程序数据转换成能被存储并传输的格式的过程被称为序列化(serialization),而它的逆过程被称为反序列化(deserialization)。

  • 简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它根据流重构对象。这两个过程结合起来,可以轻松地存储和传输数据。

  • 序列化:将数据结构或对象变成字节流的形式传出去,也就是放在连续的内存地址空间中。
  • 反序列化:从字节流恢复成原来的对象或数据结构,从连续的内存地址空间恢复成对象或数据结构。

2. pb、json、xml对比图

在这里插入图片描述

protobuf特点是避免字节不对齐,数据解析失败,克服结构体字节对其的缺点。如下图所示,对于序列化协议来说,使用方只需要关注业务对象本身,即 idl 定义,序列化和反序列化的代码只需要通过工具生成即可。

在这里插入图片描述
参考博文:【杂谈】protobuf详解

3. Protobuf原理

  • Protobuf就是一个网络通信协议,它提供了高效率的序列化与反序列化机制,
  • 网络通讯协议:在计算机网络中进行数据交换而建立的规则、标准或约定的集合。
  • Protobuf对于不同的字段类型采用不同的编码方式和数据存储方式对消息字段进行序列化,以确保得到高效紧凑的数据压缩。

1. Protobuf序列化过程如下:

  • 1)判断每个字段是否有设置值,有值才进行编码。

  • 2)根据字段标识号与数据类型将字段值通过不同的编码方式进行编码。

  • 3)将编码后的数据块按照字段类型采用不同的数据存储方式封装成二进制数据流。

2. Protobuf反序列化:

  • 1)调用消息类的parseFrom(input)解析从输入流读入的二进制字节数据流。

  • 2)将解析出来的数据按照指定的格式读取到Java、C++、Phyton对应的结构类型中。

3. Protobuf数据存储三大原则:

  • 1)Protocol Buffer将消息中的每个字段进行编码后,利用T - L - V 存储方式进行数据的存储,最终得到一个二进制字节流。

  • 2)ProtoBuf对于不同数据类型采用不同的序列化方式(数据编码方式与数据存储方式)
    Protobuf对于不同的字段类型采用不同的编码和数据存储方式对消息字段进行序列化,以确保得到高效紧凑的数据压缩。不同类型的数据采用的编码方式和存储方式如下图所示:
    在这里插入图片描述

  • 对于Varint编码数据的存储,不需要存储字节长度Length,使用T-V存储方式进行存储;

  • 对于采用其它编码方式(如LENGTH_DELIMITED)的数据,使用T-L-V存储方式进行存储。

  • 编码方式采用64bit编码表示:编码后数据大小为64bit,高位在后,低位在前

  • WireType=2的序列化

    • WireType=2的类型包括string,bytes,嵌套消息,packed repeated字段。

    • 对于编码方式,标识符Tag采用Varint编码,字节长度Length采用Varint编码,string类型字段值采用UTF-8编码,嵌套消息类型的字段值根据嵌套消息内部的字段数据类型进行选择,

    • 数据存储方式使用T-L-V方式存储二进制字节流。

  • 3)ProtoBuf对于数据字段值的独特编码方式与T-L-V数据存储方式,使得 ProtoBuf序列化后数据量体积极小。

4. Protobuf使用教程

  • 第三方库介绍——Protobuf库(更高效的协议)

5. json与xml的区别,以及二者之间的转化

1. 简单介绍下json

  • json:是javascript object Notation

  • json类似于xml,,JSON 比 XML 更小、更快,更易解析。

  • json的语法大致如下 : 数据使用 名/值 对表示

  • 名字固定用字符串表示,放在""内

  • json的值,可以是 数字,字符串,逻辑值,数组,对象

  • json中使用大括号保存对象, 使用方括号保存数组

  • 名/值对之间使用 逗号分割

2. 例子

一般情况下 json表示数据的时候最外面是个{ },代表描述的是一个整体对象,也可以不是,[ ]表示数组

{
	"cars":[
		{"company":"德国大众","name":"奥迪","price":"1600"},
		{"company":"美国通用汽车","name":"雪弗兰","price":"1800"}
	]
}

当然也可以简化下

[
	{"company":"德国大众","name":"奥迪","price":"1600"},
	{"company":"美国通用汽车","name":"雪弗兰","price":"1800"}
]

3. 简单的介绍下xml

  • XML 指可扩展标记语言(EXtensible Markup Language)

  • XML 是一种标记语言,类似 HTML

  • XML 的设计宗旨是传输数据,而非显示数据

  • XML 标签没有被预定义。您需要自行定义标签。

  • XML 被设计为具有自我描述性。

  • XML必须有根标签,XML 文档形成一种树结构

  • 所有元素均可拥有文本内容和属性(类似 HTML 中)

  • xml表示的会更大,但是结构相对json更好阅读些

4. 在线转化工具

json和xml的转化在线转化工具

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

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

相关文章

web存储(Storage)

目录 1、基本概念 2、功能监测 2.1 测试可用性 2、W3C标准 3、基本方法或属性 4、 Local Storage 4.1 描述 4.2 示例 5、sessionStorage 5.1 描述 5.2 示例 6、StorageEvent(存储事件) 6.1 构造函数 6.2 实例属性 6.3 实例方法 6.4 响应…

【spring源码系列-04】注解方式启动spring时refresh的前置工作

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【二】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428【三】xml配置文件启动spring时refres…

团体程序设计天梯赛-练习集L2篇⑨

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…

线性代数高级--矩阵的秩--SVD分解定义--SVD分解的应用

目录 矩阵的秩 概念 k阶子式 矩阵的秩的定义 矩阵的秩的性质 SVD分解 概念 注意 SVD的分解过程 SVD分解的应用 矩阵的秩 概念 矩阵的秩是线性代数中的一个重要概念,用于描述矩阵的行(或列)向量的线性无关程度。矩阵的秩可以通过…

Spring Data JPA 报 HOUR_OF_DAY: 0 -> 1异常的解决过程和方案

在进行数据查询时,控制台报了Caused by: com.mysql.cj.exceptions.WrongArgumentException: HOUR_OF_DAY: 0 -> 1异常,查询得知:这是由于查mysql库,转换类型为datetime类型的字段引起的。 网上的解决方案有多种,大…

fastadmin如何自定义一个列表上的按钮。

参考文档: 首先,这是没有新增按钮的,只有删除和编辑。 然后js按钮是这一块: 我现在呢想加上一个撤销的按钮怎么办呢,只需要在js加上这一串代码就行了。 {field: "operate",title: __("Operate")…

uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build

场景 最近在使用uni-app开发H5移动端,跟往常一样使用axios发请求,做一些全局的请求拦截响应拦截操作 uni-app数据存储,uni-ui组件开发,配置axios,vuex。配置了vue.config.js文件做跨域操作 运行到谷歌浏览器一切正常…

HBase(8):扫描操作

1 需求 查看ORDER_INFO表中所有的数据 1.2 scan命令 在HBase,我们可以使用scan命令来扫描HBase中的表。语法: scan 表名 1.3 扫描ORDER_INFO表 scan ORDER_INFO,{FORMATTER => toString} 注意:要避免scan一张大表! 2 需求二:查询订单数据(只显示3条) scan ORDE…

从0开始,精通Go语言Rest微服务架构和开发

说在前面 现在拿到offer超级难,甚至连面试电话,一个都搞不到。 尼恩的技术社区中(50),很多小伙伴凭借 “左手云原生右手大数据”的绝活,拿到了offer,并且是非常优质的offer,据说年…

响应式数据大屏开发rem、%、vh/vm

前言 响应式数据大屏开发rem、%、vh/vm 我们在开发数据大屏的时候难免会需要解决响应式问题 ,那么响应式是什么呢? 响应式:响应式布局是元素随着屏幕发生宽高大小变化 盒子布局发生变化 通俗的来说: 自适应:元素随着…

尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址:尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…

深入理解深度学习——Transformer:编码器(Encoder)部分

分类目录:《深入理解深度学习》总目录 相关文章: 注意力机制(AttentionMechanism):基础知识 注意力机制(AttentionMechanism):注意力汇聚与Nadaraya-Watson核回归 注意力机制&#…

Unix/Linux编程:UDS 流(Stream)

〇、前言 socket 是一种 IPC (Inter-Process Communication,进程间通信)方法,它允许位于同一主机(计算机)或使用网络连接起来的不同主机上的应用程序之间交换数据。通过使用Socket,开发人员可以…

HTML5 游戏开发实战 | 贪吃蛇

在该游戏中,玩家操纵一条贪吃的蛇在长方形场地里行走,贪吃蛇按玩家所按的方向键折行,蛇头吃到食物(豆)后,分数加10分,蛇身会变长,如果贪吃蛇碰上墙壁或者自身的话,游戏就结束了(当然也可能是减去…

企业级微服务架构实战项目--xx优选-用户登录

一 用户登录的触发页面 1.登录常量 2.登录地址 3.配置域名 4.启动程序 触发连接小程序后端的登录接口 小程序controller的登录方法

XR云新未来圆桌精彩回顾 | XR应用场景迭代下的新商业模式

6月15日,由平行云联合首都在线共同主办,中关村软件园协办,以“XR云新未来|弹性算力赋能可交互、沉浸式商业实践”为主题的XR行业交流盛会在北京成功举办。 本次会议我们邀请到平行云科技创始人兼CEO 李岩、XREAL 云XR负责人 吴维、瑞帆科技…

利用SQL注入漏洞登录后台

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQ…

LLM-Client一个轻量级的LLM集成工具

大型语言模型(llm)已经彻底改变了我们与文本交互的方式,OpenAI、Google、AI21、HuggingfaceHub、Anthropic和众多开源模型提供了不同的功能和优势。但是每个模型都有其独特的体系结构、api和兼容性需求,集成这些模型是一项耗时且具有挑战性的任务。 所以…

【spring cloud学习】4、创建服务提供者

注册中心Eureka Server创建并启动之后,接下来介绍如何创建一个Provider并且注册到Eureka Server中,再提供一个REST接口给其他服务调用。 首先一个Provider至少需要两个组件包依赖:Spring Boot Web服务组件和Eureka Client组件。如下所示&…

跑步适合戴哪种耳机不掉、公认最好的运动耳机推荐

我们都知道,运动往往让人感到枯燥无味,于是很多人选择听音乐来赋予运动更多乐趣。对于那些热爱运动并经常锻炼的朋友们来说,选择一款出色的运动耳机来提升体验是非常重要的。然而,面对市面上众多的选择,该如何下手呢&a…