protobuf多平台使用
男人站直别趴下,胜者困难不低头。
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 filed4 = 4; //枚举类型 enum filed5 { 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
ByteString
[]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