protobuf使用说明书

protobuf使用说明书

本说明旨在指导和帮助用户如何简单快速的使用protobuf,提供了java和python两种使用示例。如果对其实现算法及其他细节感兴趣请参考protobuf官方文档,但是需要翻墙访问,不过在我天朝程序员面前,天空飘来五个字儿:这都不叫事儿!

一、环境准备

1、下载protoc编译器压缩包,解压后将bin目录配置到环境变量。

2、安装protobuf依赖库:

  • python:pip install protobuf 或者下载源码进行手动安装
  • java:配置maven(gradle)依赖,或者下载jar包手动添加外部依赖。pom依赖示例如下:
二、准备proto文件,样例文件protobuf_demo.proto如下:
必要的说明:

1、字段限制:可以在字段前添加required或optional标记,例如:required uint32 uid=1,用来标记某个字段在序列化时是否必传,如果不添加该标记则默认为optional,例子protobuf_demo.proto中的所有字段都是可选的,也建议这样做,伸缩性好。

2、默认值处理,即在序列化与反序列化时不给相应字段传值的默认值处理

  • string类型默认为空字符串
  • bytes类型默认为空字节串
  • bool类型默认为false
  • 数字类型默认为0
  • enum类型默认为枚举类型中的第一个定义的值,而且必须为0
  • repeated默认值为空数组

关于protobuf支持的字段类型,这里给出C++、Java、python所对应的类型,可参考如下列表:

.proto Type Notes C++ Type Java Type Python Type
double double double float
float float float float
int32 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. int32 int int
int64 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. int64 long int/long
uint32 Uses variable-length encoding. uint32 int int/long
uint64 Uses variable-length encoding. uint64 long int/long
sint32 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. int32 int int
sint64 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. int64 long int/long
fixed32 Always four bytes. More efficient than uint32 if values are often greater than 228. uint32 int int
fixed64 Always eight bytes. More efficient than uint64 if values are often greater than 256. uint64 long int/long
sfixed32 Always four bytes. int32 int int
sfixed64 Always eight bytes. int64 long int/long
bool bool boolean bool
string A string must always contain UTF-8 encoded or 7-bit ASCII text. string String str/unicode
bytes May contain any arbitrary sequence of bytes. string ByteString str

三、编译protobuf文件,将其转换为目标语言的代码文件

第一步已经配置好protoc编译器,通过命令行进入proto文件所在的目录,然后在命令行输入如下命令:

1、java版本:

编译后会在当前目录下按照定义的package和classname生成包和类文件ProtoDemo.java

2、python版本:

编译后在当前目录下生成protobuf_demo_pb2.py文件

关于protoc支持的其他命令行选项可输入protoc –help查看。

四、利用生成的代码文件进行实际应用开发,这一部分通过一个网络IO的例子来演示如何利用protobuf提供的API进行序列化与反序列化操作。

1、首先定义一个sockerserver来接收序列化的数据并将数据原路返回,这部分server端的代码利用python定义

2、定义client端,用于向echo_server发送及接收数据,client端的代码中需要引用第三步编译生成的代码文件及第一步安装的protobuf库中所提供的各种API。

Python版本:

启动echo_server,然后运行protodemo.py会得到如下输出:

Java版本TestProto.java:

输出差不多这里就不贴出来了。通过一个简单的例子来展示了下protobuf api的使用,当然其api是很多的,具体的可参考API官方文档。

说点什么

avatar
  订阅  
提醒