浅入浅出之- Protobuf

概念

Protobuf是Protocol Buffers的简称,它是Google公司开发的一种数据描述语言,用于描述一种轻便高效的结构化数据存储格式,并于2008年对外开源。Protobuf可以用于结构化数据串行化,或者说序列化。它的设计非常适用于在网络通讯中的数据载体,很适合做数据存储或 RPC 数据交换格式,它序列化出来的数据量少再加上以 K-V 的方式来存储数据,对消息的版本兼容性非常强,可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。开发者可以通过Protobuf附带的工具生成代码并实现将结构化数据序列化的功能。Protobuf中最基本的数据单元是message,在message中可以嵌套message或其它的基础数据类型的成员。

Message

定义一个搜索请求的message

syntax ="proto3";

message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 result_per_page =;
}
  • .proto文件的第一行指定了使用 proto3语法。如果省略protocol buffer编译器默认使用 proto2语法。他必须是文件中非空非注释行的第一行。
  • SearchRequest定义中指定了三个字段(name/value键值对),每个字段都会有名称和类型。

指定字段类型

上面的例子中,所有的字段都是标量类型的两个整型(pagenumber,resultper_page)和一个字符串型(query)。不过你还可以给字段指定复合类型,包括枚举类型和其他message类型

指定字段编号

在message定义中每个字段都有一个唯一的编号,这些编号被用来在二进制消息体中识别你定义的这些字段,一旦你的message类型被用到后就不应该在修改这些编号了。注意在将message编码成二进制消息体时字段编号1-15将会占用1个字节,16-2047将占用两个字节。所以在一些频繁使用用的message中,你应该总是先使用前面1-15字段编号。你可以指定的最小编号是1,最大是2E29 - 1(536,870,911)。其中19000到19999是给protocol buffers实现保留的字段标号,定义message时不能使用。同样的你也不能重复使用任何当前message定义里已经使用过和预留的字段编号。

proto生成代码

当使用protocol buffer编译器编译 .proto文件时,编译器会根据你在 .proto文件中定义的message类型生成指定编程语言的代码。生成的代码包括访问和设置字段值、格式化message类型到输出流,从输入流解析出message等。要生成Java,Python,C ++,Go,Ruby,Objective-C或C#代码,你需要使用 .proto文件中定义的消息类型,你需要在 .proto上运行protocol buffer编译器 protoc。如果尚未安装编译器,请下载该软件包并按照README文件中的说明进行操作。

定义服务

如果想消息类型与RPC(远程过程调用)系统一起使用,你可以在 .proto文件中定义一个RPC服务接口,然后protocol buffer编译器将会根据你选择的编程语言生成服务接口代码和stub,加入你要定义一个服务,它的一个方法接受 SearchRequest消息返回 SearchResponse消息,你可以在 .proto文件中像如下示例这样定义它:

service SearchService{
  rpc Search (SearchRequest) returns (SearchResponse);
}

与protocol buffer 一起使用的最简单的RPC系统是 gRPC:一种由Google开发的语言和平台中立的开源RPC系统。gRPC特别适用于protocol buffer,并允许您使用特殊的protocol buffer编译器插件直接从 .proto文件生成相关的RPC代码。

横向对比

xml、json也可以用来存储此类结构化数据,但是使用protobuf表示的数据能更加高效,并且将数据压缩得更小,大约是json格式的1/10,xml格式的1/20。它们直接使用字段名称维护序列化后类实例中字段与数据之间的映射关系,一般用字符串的形式保存在序列化后的字节流中。消息和消息的定义相对独立,可读性较好。但序列化后的数据字节很大,序列化和反序列化的时间较长,数据传输效率不高。

Protobuf和Xml、Json序列化的方式不同,采用了二进制字节的序列化方式,用字段索引和字段类型通过算法计算得到字段之前的关系映射,从而达到更高的时间效率和空间效率,特别适合对数据大小和传输速率比较敏感的场合使用。

优劣对比

优:protobuf的空间效率是JSON的2-5倍,时间效率高,对于数据大小敏感,传输效率高的模块可以采用protobuf库

劣:消息结构可读性不高,序列化后的字节序列为二进制序列不能简单的分析有效性,目前使用不广泛,只支持java,C++和Python、

希望能对你有所帮助,我是热爱互联网的高飞,如有疑问,欢迎评论,希望能与你一起讨论,当然也期待点个赞以示鼓励啦

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值