持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
protobuf是Google开源的一款支持跨平台、语言中立的结构化数据描述和高性能序列化协议,此协议完全基于二进制,所以性能要远远高于JSON/XML。由于出色的传输性能所以常见于微服务之间的通讯,其中最为著名的是Google开源的 gRPC 框架。
个人理解PB关键点在于数据序列化与数据反序列化。 其中原理之后再进行研究,目前只把最近相关代码实现展示。
ProtoBuf的优缺点
优点:
- 效率高
从序列化后的数据体积角度,与XML、JSON这类文本协议相比,ProtoBuf通过T-(L)-V(TAG-LENGTH-VALUE)方式编码,不需要", {, }, :等分隔符来结构化信息,同时在编码层面使用varint压缩,所以描述同样的信息,ProtoBuf序列化后的体积要小很多,在网络中传输消耗的网络流量更少,进而对于网络资源紧张、性能要求非常高的场景,ProtoBuf协议是不错的选择。 从序列化/反序列化速度角度,与XML、JSON相比,ProtoBuf序列化/反序列化的速度更快,比XML要快20-100倍。
- 支持跨平台、多语言
ProtoBuf是平台无关的,无论是Android与PC,还是C#与Java都可以利用ProtoBuf进行无障碍通讯。 proto3支持C++, Java, Python, Go, Ruby, Objective-C, C#。
- 扩展性、兼容性好
具有向后兼容的特性,更新数据结构以后,老版本依旧可以兼容,这也是ProtoBuf诞生之初被寄予解决的问题。因为编译器对不识别的新增字段会跳过不处理。
- 使用简单
ProtoBuf 提供了一套编译工具,可以自动生成序列化、反序列化的样板代码,这样开发者只要关注业务数据idl,简化了编码解码工作以及多语言交互的复杂度。
缺点:
可读性差,缺乏自描述XML,JSON是自描述的,而ProtoBuf则不是。 ProtoBuf是二进制协议,编码后的数据可读性差,如果没有idl文件,就无法理解二进制数据流,对调试不友好。
ProtoBUf消息定义 ProtoBuf的消息在文件(.proto)中描述的。 示例:
syntax = "proto3";
package sample;
message Students{
repeated Student student = 1;
}
message Student{
string name;
int32 age;
}
protobuf在node.js解析和序列化的代码
protobuf在C++解析和序列化的代码