Protocol Buffers 是一种轻便高效的结构化数据存储格式,可用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于 通讯协议 、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
Protocol Buffers 是一种语言中立、平台中立的可扩展机制,用于序列化结构化数据。
protobuf 定义
syntax = "proto3"; // 定义proto的版本
package xxx; // 定义proto的包名,包名可以避免对message 类型之间的名字冲突,同名的Message可以通过 package 进行区分。
import "google/protobuf/any.proto"; //引入其它proto文件
option go_package = "xxx"; // 指定生成的 go 文件package
// 同一个message的每个字段都有唯一一个编号,并且建议终生这个编号都不要改变。
message AllNormalypes {
// 数字类型: double、 float 、int32、int64、uint32、uint64、sint32、sint64: 存储长度可变的浮点数、整数、无符号整数和有符号整数
double field1 = 1;
float field2 = 2;
int32 field3 = 3;
int64 field4 = 4;
uint32 field5 = 5;
uint64 field6 = 6;
sint32 field7 = 7;
sint64 field8 = 8;
// 存储固定大小的数字类型:fixed32、fixed64、sfixed32、sfixed64: 存储空间固定
fixed32 field9 = 9;
fixed64 field10 = 10;
sfixed32 field11 = 11;
sfixed64 field12 = 12;
// 布尔 类型: bool
bool field13 = 13;
// 字符串 : string
string field14 = 14;
// bytes: 字节数组
bytes field15 = 15;
}
message Unnormalypes {
// oneOf 如果你有一组字段,同时最多允许这一组中的一个字段出现,就可以使用Oneof定义这一组字段,这有点Union的意思,但是Oneof允许你设置零各值。
oneof field1 {
string filed2 = 1;
int64 filed3 = 2;
}
// map类型需要设置键和值的类型,格式是"map" "<" keyType "," TYPE ">" mapName "=" fieldNumber [ "[" fieldOptions "]"。
map<int32, string > filed4 = 4;
//枚举类型
enum file d5 {
TYPE_UNKNOWN = 0; //第一个枚举值必须是0,而且必须定义。
TYPE_A = 1;
TYPE_B = 2;
}
//Any字段允许你处理嵌套数据,并不需要它的proto定义。一个Any以 bytes 呈现序列化的消息,并且包含一个URL作为这个类型的唯一标识和元数据。
//为了使用Any类型,你需要引入google/protobuf/any.proto。
google.protobuf.Any filed6 = 6;
}
除了上面这些类型外还有 repeated 修饰符,代表可重复(可以理解为数组)
proto 类型与其他部分语言的类型对照
.proto Type | java /Kotlin Type | Go Type | PHP Type |
double | double | float64 | float |
float | float | float32 | float |
int32 | int | int32 | integer |
int64 | long | int64 | integer/string |
uint32 | int | uint32 | integer |
uint64 | long | uint64 | integer/string |
sint32 | int | int32 | integer |
sint64 | long | int64 | integer/string |
fixed32 | int | uint32 | integer |
fixed64 | long | uint64 | integer/string |
sfixed32 | int | int32 | integer |
sfixed64 | long | int64 | integer/string |
bool | boolean | bool | boolean |
string | String | string | string |
bytes | byte String | []byte | string |
生成对应语言的结构体
# 生成php文件
protoc --php_out=./php -I ./google --grpc_out=generate_server:./php --proto_path=./proto --plugin=protoc-gen-grpc=/usr/bin/grpc_php_plugin ./*.proto
// 生成golang文件
protoc --go_out=./golang -I ./google --go-grpc_out=./golang --proto_path=./proto --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative ./*.proto
// 生成java 文件
protoc --go_out=./java -I ./google --java_out=./java --proto_path=./proto ./*.proto