.proto
做为文件后缀,除结构定义以外的语句以分号结尾enum GenderType { SECRET = 0; FEMALE = 1; MALE = 2; } // 人 message Person { int64 id = 1; string name = 2; GenderType gender = 3; string number = 4; } 复制代码
字段格式:限定修饰符 | 数据类型 | 字段名称 | = | 字段编码值 | [字段默认值]java
限定修饰符包含:required、optional、repeated数组
Protobuf定义了一套基本数据类型:markdown
Protobuf 数据类型 | 描述 | 打包 |
---|---|---|
bool | 布尔类型 | 1字节 |
double | 64位浮点数 | N |
float | 32位浮点数 | N |
int32 | 32位整数 | N |
uint32 | 无符号32位整数 | N |
int64 | 64位整数 | N |
uint64 | 64位无符号整数 | N |
$int32 | 32位整数,处理负数效率更高 | N |
$int64 | 64位整数,处理负数效率更高 | N |
fixed32 | 32位无符号整数 | 4 |
fixed64 | 64位无符号整数 | 8 |
$fixed32 | 32位整数,能以更高的效率处理负数 | 4 |
$fixed64 | 64位整数,能以更高的效率处理负数 | 8 |
string | 只能处理ASCII字符 | N |
bytes | 用于处理多字节的语言字符,如中文 | N |
enum | 能够包含一个用户自定义的枚举类型uint32 | N(uiint32) |
message | 能够包含一个用户自定义的消息类型 | N |
.proto
文件中定义一个 RPC 服务接口,protocol buffer 编译器会根据所选择的不一样语言生成服务接口代码好比,想要定义一个 RPC 服务并具备一个方法,该方法接收 SearchRequest 并返回一个 SearchResponse,此时能够在.proto
文件中进行以下定义:ui
service SearchService { rpc Search(SearchRequest) returns (SearchResponse) {} } 复制代码
一个 .proto 文件中能够定义多个消息类型,通常用于同时定义多个相关的消息,例如在同一个 .proto 文件中同时定义搜索请求和响应消息:编码
syntax = "proto3" // 声明使用的 protobuf 版本 message SearchRequest { string query = 1; // 查询字符串 int32 page_number = 2; int32 result_per_page = 3; } message SearchResponse { } 复制代码
message 支持嵌套使用,做为另外一个 message 中的字段类型url
message SearchResponse { repeated Result results = 1; } message Result { string url = 1; string title = 2; repeated string snippets = 3; } 复制代码
支持嵌套消息,消息能够包含另外一个消息做为字段。也能够在消息内定义一个新的消息。spa
内部声明的 message 类型名称只可在内部直接使用:code
message SearchResponse { message Result { string url = 1; string title = 2; repeated string snippets = 3; } repeated Result results = 1; } 复制代码
另外,还能够多层嵌套:orm
message Outer { message A { message Inner { int64 ival = 1; bool booly = 2; } } message B { message Inner { int64 ival = 1; bool booly = 2; } } } 复制代码
proto3 支持 map 类型声明接口
键、值类型能够是内置类型,也能够是自定义 message 类型
字段不支持 repeated 属性
map<key_type, value_type>map_field = N; message Project {...} map<string, Project>projects = 1; 复制代码
能够使用 import 语句导入使用其它描述文件中声明的类型
protobuf 接口文件能够经过 import 导入须要的文件,例如: import "example.proto"
protobuf 编译器会在 -I/ --proto_path 参数指定的目录中查找导入的文件,若是没有指定该参数,默认在当前目录中查找
在 proto 文件中使用 package 声明包名,避免命名冲突:
syntax = "proto3" package foo.bar message Open {...} 复制代码
在其余的消息格式定义中能够使用包名 + 消息名的方式来使用类型,如:
message Foo { ... foo.bar.Open open = 1; ... } 复制代码
在不一样的语言中,包名定义对编译后生成的代码影响不一样: