Protobuf即Protocol Buffers,是Google公司开发的一种跨语言和平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议。与XML和JSON格式相比,protobuf更小、更快、更便捷。而且Protobuf是跨语言的,并且自带一个编译器(protoc),只需要用protoc进行编译,就可以编译成Java、Python、C++、C#、Go等多种语言代码,然后可以直接使用,不需要再写其它代码,自带有解析的代码。
一. Protocbuf编译器的安装
从https://github.com/protocolbuffers/protobuf/releases上下载最新的release包,并解压到你的安装目录下,然后将其下面的bin目录添加为系统环境变量,如mac操作系统下:
export PATH=$PATH:/usr/local/protobuf/bin
这样就可以在任意地方的命令行窗口下使用protoc指令,如检查protoc编译器版本:
protoc --version
二. Protocbuf3语法
1. 版本声明
syntax = "proto3";
.proto文件中非注释非空的第一行必须使用Proto版本声明,如果不使用proto3版本声明,Protobuf编译器默认使用proto2版本。
2. Package
package com.aervon.proto;
.proto文件中可以新增一个可选的package声明符,用来防止不同的消息类型有命名冲突。包的声明符会根据使用语言的不同影响生成的代码:
A、对于C++语言,产生的类会被包装在C++的命名空间中。
B、对于Java语言,包声明符会变为java的一个包,除非在.proto文件中提供了一个明确有java_package。
C、对于Go语言,包可以被用做Go包名称,除非显式的提供一个option go_package在.proto文件中。
3. Import
import "google/protobuf/timestamp.proto";
通过import声明符可以引用其他.proto里的结构数据体,如以上声明后就可以使用google.protobuf.Timestamp了。
4. 消息定义
message Person {
string name = 1;
int32 id = 2 [default = 0];
string email = 3;
}
Protobuf中,消息即结构化数据。其中变量的声明结构为:
字段规则 + 字段类型 + 字段名称 + [=] + 标识符 + [默认值]
字段规则有:
required: 结构体必须包含该字段一次
optional: 结构体可以包含该字段零次或一次(不超过一次)
repeated: 该字段可以在格式良好的消息中重复任意多次(包括0),其中重复值的顺序会被保留,相当于数组
PS: 在 proto3 中已经为兼容性彻底抛弃 required
字段类型可以具有以下几种类型,在编译器作用下会自动生成类中的相应类型:
.proto Type
Notes
C++ Type
Java Type
Python Type
Go Type
double
double
double
float
*float64
float
float
float
float
*float32
int32
使用可变长度编码。编码负数的效率低 - 如果你的字段可能有负值,请改用 sint32
int32
int
int
*int32
int64
使用可变长度编码。编码负数的效率低 - 如果你的字段可能有负值,请改用 sint64
int64
long
int/long
*int64
uint32
使用可变长度编码
uint32
int
int/lon