Protocol Buffer使用手册

本文详细介绍了Protocol Buffers(PB)文件。涵盖文件名、引用方式,阐述了文件内容,包括消息类型、数据类型、字段序号、规则、命名空间等,还提及注释、预留字段、默认值、枚举类型等要点。最后说明PB编译器可将proto文件转换成多种语言代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、文件名:*.proto

二、PB文件引用:

import  "myprojce/other_protos.proto";

三、文件内容:

1.消息类型

message msgName{

require string query=1;

optional int32 page_number=2;
}

说明:

1)一个.proto文件中可以定义多个message类型。

2)同时,如果1个.proto文件定义了多个具有不同依赖的message,会导致依赖膨胀;建议每个文件包含尽可能少的message。

2.数据类型

标量类型:

.proto 类型说明C++ 数据类型Java 数据类型Python 数据类型Go 数据类型
double doubledoublefloat*float64
float floatfloatfloat*float32
int32

1)使用可变长度编码;

2)对负数编码效率较低,若字段可能为负值,请使用sint32。

int32intint*int32
int64

1)使用可变长度编码;

2)对负数编码效率较低,若字段可能为负值,请使用sint64。

int64longint/long[3]*int64
uint32使用可变长度编码uint32int[1]int/long[3]*uint32
uint64使用可变长度编码;uint64long[1]int/long[3]*uint64
sint32

1)使用可变长度编码;

2)有符号int,编码负数时比int32更高效。

int32intint*int32
sint64

1)使用可变长度编码;

2)有符号int,编码负数时比int64更高效。

int64longint/long[3]*int64
fixed32

1)固定4字节;

2)如果数值经常大于228,则比uint32的编码效率高。

uint32int[1]int/long[3]*uint32
fixed64

1)固定8字节;

2)如果数值经常大于256,则比uint64的编码效率高。

uint64long[1]int/long[3]*uint64
sfixed32固定4字节int32intint*int32
sfixed64固定8字节int64longint/long[3]*int64
bool boolbooleanbool*bool
string

字符串,必须包含UTF-8编码或7位ASCII文本。

stringStringstr/unicode[4]*string
bytes可包含任意的字节序列stringByteStringstr[]byte

3.字段序号

举例:

require int32 samples=4; //4位字段序号

说明:message中的每个字段都有唯一序号。

作用:用于识别二进制message中的字段。

注意:

1)序号最小值为1,最大值为2^29-1(536870911);

2)不能使用19000~19999之间的数字,因为它们是为PB实现保留的。其中19000为FieldDescriptor::kFirstReservedNumber,19999为FieldDescriptor::kLastReservedNumber。如果使用了,PB编译器会报错;同样也不能重复使用已保留的字段序号。

3)消息已被使用后不能修改序号。

4)为频繁使用的消息成员保留字段号1~15。

编码格式:

1)1~15的序号用1个字节来编码(并包含字段序号和字段类型);

2)16~2017的序号暂用2个字节;

4.字段规则:

require int32 page_size=1;

required:message中必有的字段

optional:message中可以有0或1个这个字段(不超过1个),若该字段不存在,则解析为改字段的默认值

repeated:该字段在message中可以重复多次(包含0次),并保留重复值的顺序

注:该类型的字段编码效率不高,新代码需使用特殊选项[packed=true]来提高编码效率。例如:

repeated int32 samples = 4 [packed=true];

5.命名空间:

package pkg_name;

1)对于java,解析为包名;

2)对于c++,解析为namespace;

6.注释:

格式://或/**/

7.预留字段:

问题:若更新message后删除或注释了某个字段,老协议版本用户又使用了这个字段,会导致数据损坏、隐私泄露等问题。

解决方法:指定已删除字段的序号为预留,这样如果有用户尝试使用该字段标识符时,PB编译器会报错。使用例子如下:

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

注意:不能将字段名和字段号混合在同一个预留声明

8.字段默认值:

optional int32 page_size=1 [default=10];

使用说明:

1)若该字段不存在,则解析为默认值10;

2)若为设置默认值,则使用标量类型的默认值:

字符串:空;

bool:false;

数字类型:0;

枚举类型:定义列表中的第一个值

9.枚举类型:

enum MsgCmd{

MSG_LOGIN=1;

MSG_LOGOUT=2;

MSG_GET_EMAIL=3;

}

说明:枚举常量数值范围必须在32位整数内。

四、代码生成:

PB编译器可将proto文件转换成c++、java、python、go等语言的代码,包含get、set字段的值,message的序列化和反序列化。

  • C++:.h和.cc文件
  • java:为每个message生成一个.java文件,以及用于创建message类实例的Builder类。
  • python:待补充
  • go:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值