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