如何定义protobuf

1 篇文章 0 订阅
1 篇文章 0 订阅
定义消息类型

首先让我们看一个非常简单的例子。假设您要定义一个搜索请求消息格式,其中每个搜索请求都有一个查询字符串,您感兴趣的特定结果页面以及每页结果数量。这是.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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值