定义消息类型
首先让我们看一个非常简单的例子。假设您要定义一个搜索请求消息格式,其中每个搜索请求都有一个查询字符串,您感兴趣的特定结果页面以及每页结果数量。这是.proto用于定义消息类型的文件。
syntax = "proto3";
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;
}
文件的第一行指定您正在使用proto3语法:如果不这样做,则协议缓冲区编译器会假定您正在使用proto2。这必须是文件的第一行非空,非注释行。
所述SearchRequest消息定义指定了三个字段(名称/值对),一个用于每条数据要在此类型的消息包括。每个字段都有一个名称和类型。
指定字段类型
在上面的示例中,所有字段均为标量类型:两个整数(page_number和result_per_page)和一个字符串(query)。但是,您也可以为字段指定复合类型,包括枚举和其他消息类型。
分配字段编号
如您所见,消息定义中的每个字段都有一个唯一的编号。这些字段号用于标识消息二进制格式的字段,一旦使用了消息类型,就不应更改这些字段号。请注意,范围为1到15的字段编号需要一个字节来编码,包括字段编号和字段的类型。16到2047之间的字段编号占用两个字节。因此,您应该为经常出现的消息元素保留数字1到15。切记为将来可能添加的频繁出现的元素留出一些空间。
指定字段规则
消息字段可以是以下之一:
单数:可以包含零个或一个此字段(但不能超过一个)。
repeated:此字段可以重复任意次(包括零次)。重复值的顺序将保留。
添加更多消息类型
可以在单个.proto文件中定义多种消息类型。如果要定义多个相关消息,例如,如果要定义与您的SearchResponse消息类型相对应的回复消息格式,可以将其添加到相同的消息中.proto:
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;
}
message SearchResponse {
...
}
注释
类似PHP注释
// this is a comments
/** this is a comments **/
/*
@author Jack
@desc SearchRequest is a request for request ,proto results to include in the response. */
message SearchRequest {
string name = 1; // maybe is jack ?
int32 page_number = 2; // Which page number do we want?
int32 result_per_page = 3; // Number of results to return per page.
}
值类型
消息字段可以具有以下类型之一该表显示.proto文件中指定的类型,以及自动生成的类中的相应类型:
double
float
uint32
uint64
bool
string
bytes
默认值
解析消息时,如果编码的消息不包含特定的单数元素,则已解析对象中的相应字段将设置为该字段的默认值。这些默认值是特定于类型的:
对于字符串,默认值为空字符串。
对于字节,默认值为空字节。
对于布尔值,默认值为false。
对于数字类型,默认值为零。
对于枚举,默认值为第一个定义的枚举值,必须为0。
枚举
必须有一个零值,以便我们可以使用0作为数字默认值。
零值必须是第一个元素,其中第一个枚举值始终是默认值。
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;
enum Corpus {
UNIVERSAL = 0;
WEB = 1;
IMAGES = 2;
LOCAL = 3;
NEWS = 4;
PRODUCTS = 5;
VIDEO = 6;
}
Corpus corpus = 4;
}
定义服务
如果要将消息类型与RPC(远程过程调用)系统一起使用,则可以在.proto文件中定义RPC服务接口,并且协议缓冲区编译器将以您选择的语言生成服务接口代码和存根。因此,例如,如果您想使用一种方法来定义RPC服务,该方法接受您的SearchRequest并返回SearchResponse,则可以在.proto文件中按以下方式对其进行定义:
service JackService {
rpc LadyGaga(LadyGagaRequest) returns (LadyGagaoResponse);
}