这里我们既然已经介入了proto文件,那么我们编写proto文件的时候就要学习下相关的语法,这里我们在网上找到一篇看起来比较清晰的语法文章,在这里给大家演示一下:
一、基础语法示例
这里我们先演示一个完整的proto文件,数据示例如下:
/* 头部相关声明 */ syntax = "proto3"; // 语法版本为protobuf3.0 package = "com.xxx.foo"; // 定义包名 import "common.proto"; // 导入common.proto option java_package = "com.xxx.foo"; // 指定java包 // 搜索请求 message SearchRequest{ int32 page = 1; // 当前页 int32 page_size = 2; // 一页多少条,使用下划线分隔,设置的时候使用驼峰命令法,如:setPageSize(10); enum Type { IN = 0; // 0需要是第一个,第一个也是默认值 OUT = 1; } Type type = 3; // 类型 } // 搜索响应 message SearchResponse{ int32 code = 1; // 状态码 string message = 2; // 消息 SearchList data = 3; // 数据,类型为SearchList } // SearchList结构 message SearchList{ repeated Item data = 1; // 数据记录项,repeated类型用来存放N个相同类型的内容 int64 count = 2; // 总条数 int32 page_size = 3; // 一页条数 } // Item结构 message Item{ int64 id = 1; // id string title = 2; // 标题 int64 create_time = 3; // 创建时间 int64 update_time = 4; // 更新时间 } // 服务 service SearchService{ rpc GetSearchList(SearchRequest) returns (SearchResponse); // rpc 方法 }
在这个文件里面我们有对应的实体,方法信息。对于proto语法里面的字段类型枚举有:
序号 | 类型 | 说明 |
1 | float | |
2 | double | |
3 | int32 | 变长编码,打算使用负数的话可以使用sint32 |
4 | int64 | 变长编码,打算使用负数的话可以使用sint64 |
5 | uint32 | 变长编码 |
6 | uint64 | 变长编码 |
7 | sint32 | 变长编码,有负数的时候建议使用 |
8 | sint64 | 变长编码,有负数的时候建议使用 |
9 | fixed32 | 固定4byte,如果数值大于2的28次方效率高于uint32 |
10 | fixed64 | 固定8byte,如果数值大于2的28次方效率高于uint64 |
11 | sfixed32 | 固定4byte |
12 | sfixed64 | 固定8byte |
13 | bool | |
14 | string | 字符串UTF-8编码或者ASCII文本 |
15 | byte | 任意二进制数据 |
二、字段修饰符
字段修饰符主要是给实体类使用的,有如下的字段修饰符:
序号 | 修饰符 | 说明 |
1 | singular | 单个的,有0个或1个(默认) |
2 | repeated | 重复的,重复任意次数 |
3 | required | 要求的 |
4 | optional | 可选的 |
5 | reserved | 保留的,保留字段名或字段号 |
示例如下:
message Foo { reserved 2, 15, 9 to 11; reserved "foo", "bar"; string foo = 3 // 编译报错,因为‘foo’已经被标为保留字段 }
三、嵌套
这种一般就是实体类嵌套实体类,示例如下:
message SearchResponse { message Result { string id = 1; string title = 2; } repeated Result results = 1; }
四、引用
引用也很简单,就是类型,示例如下:
message OtherMessage { SearchResponse.Result result = 1; }
五、Any类型
这里的Any类型主要是泛类型,可以看作是java中的Object类型。示例如下:
import "google/protobuf/any.proto"; message ErrorStatus { string message = 1; repeated google.protobuf.Any details = 2; }
切记使用Any类型的话,一定要引入这个:
需要导入import google/protobuf/any.proto
六‘oneof
这里的oneof类型一般我们在java里面用的比较少,它是指所有的字段共享内存,设置oneof的任何字段会清除其他的字段,但是只能由一个oneof。示例如下:
message TestMessage { oneof test_oneof { int32 id = 1; string title = 2; } }
以上的案例例如我们设置id=1,title=test,然后我们再这是id=2,那么title就会为空。这就是设置oneof的任何字段会清除其他的字段的含义。
七、系统默认值
proto的类型对应都有一个默认值,下面我们列举下对应的默认值:
序号 | 类型 | 默认值 |
1 | string | 空字符串 |
2 | bool | false |
3 | 数值类型 | 0 |
4 | enum | 默认为第一个元素 |
最后基于proto的语法还有很多,但是我们上面介绍的其实已经能应付90%左右的场景了。
还没有评论,来说两句吧...