序列化和反序列化的认识【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使用教程

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的转化在线转化工具

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ProtoBuf是一种数据序列序列的技术,它的全称是Protocol Buffers。ProtoBuf可以将结构数据转换为二进制格式,以便在不同的系统之间进行高效的数据交换。使用ProtoBuf进行序列序列有以下几个优势: 1. 空间效率:ProtoBuf使用紧凑的二进制编码格式,可以大大减少数据的存储空间。相比于传统的文本格式如XMLJSONProtoBuf的数据大小通常要小得多。 2. 时间效率:ProtoBuf的解析和生成代码都是使用高效的机器生成,因此在序列序列过程中可以获得更快的速度。特别是在处理大规模数据时,ProtoBuf的效率更加显著。 3. 可读性:虽然ProtoBuf的数据是以二进制形式存储的,但是它的定义文件是以文本形式进行编写的,具有良好的可读性和可维护性。开发人员可以通过阅读ProtoBuf定义文件了解数据结构的字段和类型。 在前后端交互中,ProtoBuf可以作为一种通用的数据交换格式。前端可以将数据序列ProtoBuf格式,然后发送给后端进行处理。后端可以将接收到的ProtoBuf数据序列为对象,然后进行相应的业务逻辑处理。 下面是使用ProtoBuf进行序列序列的示例代码: ```java // 创建一个user对象 User user = User.builder().id("1").age(20).name("张三").desc("programmer").build(); // 创建一个Group对象,将user放入group中 Group group = Group.builder().id("1").name("分组1").user(user).build(); // 使用ProtostuffUtils序列 byte[] data = ProtostuffUtils.serialize(group); System.out.println("序列后:" + Arrays.toString(data)); // 使用ProtostuffUtils序列 Group result = ProtostuffUtils.deserialize(data, Group.class); System.out.println("序列后:" + result.toString()); ``` 在上述代码中,首先创建了一个User对象和一个Group对象,然后使用ProtostuffUtils对Group对象进行序列,将其转换为字节数组。接着使用ProtostuffUtils对字节数组进行序列,将其转换为Group对象。最后输出序列后的Group对象。 引用:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值