首页 文章 protobuf3语法
protobuf3语法
编辑时间:2020-02-07 15:54:59 作者:dashizi 浏览量:322

1. 指明版本

.proto文件中使用proto3的语法需要在开头声明:

syntax="proto3"

2. 定义消息

1
2
3
4
5
6
7
syntax = "proto3";
  
message AddUserReq {
  string name = 1;
  string password = 2;
  sint64 group_id = 3;
}

消息的字段声明由4部分构成:字段修饰符 字段类型 字段名称 = 标志号

1) 字段修饰符

* singular : 默认值,该字段可以出现0次或者1次(不能超过1次)。

* repeated : 该字段可以重复任意多次(包括0次)。proto3中,repeated默认使用packed。

proto3中在语法层将required移除,singular是由optional改名而来。

2) 字段类型

.proto typeNotesC++ typeGo type
double
doublefloat64
float
floatfloat32
int32使用变长编码,对于负值的效率很低,如果该域有可能有负值,使用sint64替代int32int32
int64
int64int64
uint32使用变长编码uint32uint32
uint64使用变长编码uint64uint64
sint32使用变长编码,处理负值时比int32高效int32int32
sint64使用变长编码,处理负值时比int64高效int64int64
fixed32固定4个字节,如果数值总是比228大,此类型比uint32高效uint32uint32
fixed64固定8个字节,如果数值总是比256大,此类型比uint64高效uint64uint64
sfixed32固定4个字节int32int32
sfixed64固定8个字节int64int64
bool
boolbool
string一个字符串,必须是UTF-8编码或7-bit ASCII编码stringstring
bytes可能包含任意顺序的字节数据string[]byte

默认值:

* string类型默认值是空字符串,不是null

* bytes类型默认是空bytes

* bool类型默认值是false

* 数字类型默认值是0

* 枚举类型默认值是第一个枚举值,即0

* repeated修饰的字段,默认值是空(在对应的编程语言中通常是一个空的list) 

3) 标志号

每一个被定义在消息中的字段都会被分配一个唯一的标量,这些标量用于标志定义在二进制消息格式中的属性。标量一旦被定义就不允许在使用过程中再次被改变。

1~15的标志号在编码的时候会占用一个字节,16~2047的标志号则占用两个字节,所以应该为频繁出现的消息元素保留1~15的标志号。

保留标识符(reserved)可以避免其他人在未来使用不该使用的标志号。

1
2
3
4
message Foo {
  reserved 2, 15, 9 to 11;
  reserved "foo""bar";
}

 

3. 枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
}

Corpus枚举类型的第一个枚举值是0,每一个枚举值定义都会与一个常量映射,而这些常量的第一个常量必须为0。

 

4. 导入其它.proto中定义的消息

import "test/result.proto";

5. 包

可以为.proto文件指定包名,防止消息名冲突。

6. 服务定义

如果想在RPC中使用已经定义好的消息类型,可以在.proto文件中定一个消息服务接口,protocol buffer编译器会生成对应语言的接口代码。

1
2
3
4
service SearchService {
    //  方法名  方法参数                 返回值
    rpc Search(SearchRequest) returns (SearchResponse);
}

  


来说两句吧
最新评论