Protobuf3

proto3相较于proto2支持更多语言且语法更为简洁,proto3去除了一些复杂的语法和特性,更加强调约定而弱化语法。

  • 删除原始值类型的presence字段逻辑
  • 删除required字段及默认值
  • 移除unknown关键字
  • 去掉extensions类型,使用Any类型替换。
  • 针对未知枚举值的固定语法
  • 增加maps代码生成支持map
  • 添加表示时间、动态数据等的标准类型
  • 替换二进制编码明确JSON编码

定义消息

例如:定义一个搜索请求的消息格式,每个请求含有查询字符串、页码、分页条数。

//声明包名:package 命名空间;
package ns;
//语法说明:syntax = "语法版本";
syntax = "proto3";
//消息格式:message + 消息名称
message SearchRequest{
    //字段:字段限制+字段类型+字段名称 = 数值标签
    string query = 1;
    int32 page = 2;
    int32 pagesize = 3;
}

声明包名

可以为.proto文件新增一个可选的package声明符,用于防止不同消息类型产生的命名冲突。

package jc.com;
message SearchRequest
{
  string query = 1;
}

在其它消息格式定义可以使用【包名+消息名】来定义域的类型

message Open
{
  required jc.com.SearchRequest rq = 1;
}

字段格式

字段限制 + 消息类型 + 字段名称 = 数值标签;
字段限制
字段限制描述
required必须赋值的字段
optional可有可无的字段
repeated可重复的字段(变长字段)

消息字段可以使用两种规则进行描述

字段规则含义描述
single单一的0个或1个,不用在字段定义中指出。
repeated重复的0个到多个,需要在字段定义中指出。

比如:一个用户只能有一个固定的账户,但可以有多个不同的昵称,也可以没有。


package ns;
syntax = "proto3";
message User{
    string account = 1;
    string username = 2;
    repeated string nickname = 3;
    string realname = 4;
}
消息类型
消息类型默认值描述
double0双精度浮点数
float0单精度浮点数
int320使用可变长度编码,编码负数的效率低,若字段有负值改用sint32。
int640使用可变长度编码,编码负数的效率低,若字段有负值改用sint64。
uint320\使用可变长度编码
uint640使用可变长度编码
sint320使用可变长度编码,比常规int32更有效编码负数。
sint640使用可变长度编码,比常规int64更有效编码负数。
fixed320占用4个字节,值大于228时比uint32更有效。
fixed640占用8个字节,如果值大于256则比uint64更有效。
sfixed320占用4个字节
sfixed640占用8个字节
boolfalse-
string""字符串必须始终包含UTF-8编码或7位ASCII文本
bytes可以包含任意字节序列
数值标签
  • 消息结构中每个字段都具有唯一的数字标识(数值类型的编号标签),用来在二进制格式中识别字段。
  • 消息一旦开始使用,数字标识就不应该在被修改。
  • 最小的数值标签为1,最大的数值标签为536,870,911。
  • 当消息被序列化为二进制后,编号1到15会使用1个字节编码,16到2047使用2个字节编码,因此编号1到15一般会留给频繁使用的字段。
  • 编号19000~19999是系统预留的,不可使用。
编号范围占用字节描述
1~151高频字段
16~20472普通字段
19000~19999系统预留
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值