没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
该文档为protobuf3.0语言,和2.0语法有兼容性问题。
《Protobuf语法指南(proto2)》见https://blog.csdn.net/qq_22660775/article/details/89044538
定义一个消息类型
先来看一个非常简单的例子。假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果
所在的页数,以及每一页多少条查询结果。可以采用如下的方式来定义消息类型的.proto文件了
文件的第一行指定了你正在使用proto3语法:如果你没有指定这个,编译器会使用proto2。这个指定语法行必须是文件的非
空非注释的第一个行。
SearchRequest消息格式有3个字段,在消息中承载的数据分别对应于每一个字段。其中每个字段都有一个名字和一种类
型。
指定字段类型
在上面的例子中,所有字段都是标量类型:两个整型(page_number和result_per_page),一个string类型(query)。当然,你
也可以为字段指定其他的合成类型,包括枚举(enumerations)或其他消息类型。
分配标识号
正如你所见,在消息定义中,每个字段都有唯一的一个数字标识符。这些标识符是用来在消息的二进制格式中识别各个字段的,
一旦开始使用就不能够再改变。注:[1,15]之内的标识号在编码的时候会占用一个字节。[16,2047]之内的标识号则占用2个字节。
所以应该为那些频繁出现的消息元素保留[1,15]之内的标识号。切记:要为将来有可能添加的、频繁出现的标识号预留一些标识
号。
最小的标识号可以从1开始,最大到2^291,or536,870,911。不可以使用其中的[19000-19999]((从
FieldDescriptor::kFirstReservedNumber到FieldDescriptor::kLastReservedNumber))的标识号,Protobuf协议实现中对这些进
行了预留。如果非要在.proto文件中使用这些预留标识号,编译时就会报警。同样你也不能使用早期保留的标识号。
指定字段规则
所指定的消息字段修饰符必须是如下之一:
singular:一个格式良好的消息应该有0个或者1个这种字段(但是不能超过1个)(默认为singular,而且显示写上singular关
键字会报错,这个是Google的一个坑)。
repeated:在一个格式良好的消息中,这种字段可以重复任意多次(包括0次)。重复的值的顺序会被保留。
在proto3中,repeated的标量域默认情况下使用packed。
你可以了解更多的pakced属性在ProtocolBuffer编码
syntax="proto3";
messageSearchRequest{
stringquery=1;
int32page_number=2;
int32result_per_page=3;
}
1
2
3
4
5
6
7
添加更多消息类型
在一个.proto文件中可以定义多个消息类型。在定义多个相关的消息的时候,这一点特别有用——例如,如果想定义与
SearchResponse消息类型对应的回复消息格式的话,你可以将它添加到相同的.proto文件中,如:
添加注释
向.proto文件添加注释,可以使用C/C++/java风格的双斜杠(//)语法格式,如:
保留标识符(Reserved)
如果你通过删除或者注释所有域,以后的用户可以重用标识号当你重新更新类型的时候。如果你使用旧版本加载相同的.proto文
件这会导致严重的问题,包括数据损坏、隐私错误等等。现在有一种确保不会发生这种情况的方法就是指定保留标识符(and/or
names,whichcanalsocauseissuesforJSONserialization不明白什么意思),protocolbuffer的编译器会警告未来尝试使用这些
域标识符的用户。
注:不要在同一行reserved声明中同时声明域名字和标识号
从.proto文件生成了什么?
当用protocolbuffer编译器来运行.proto文件时,编译器将生成所选择语言的代码,这些代码可以操作在.proto文件中定义的消息
类型,包括获取、设置字段值,将消息序列化到一个输出流中,以及从一个输入流中解析消息。
messageSearchRequest{
stringquery=1;
int32page_number=2;
int32result_per_page=3;
}
messageSearchResponse{
...
}
messageSearchRequest{
stringquery=1;
int32page_number=2;//Whichpagenumberdowewant?
int32result_per_page=3;//Numberofresultstoreturnperpage.
}
messageFoo{
reserved2,15,9to11;
reserved"foo","bar";
}
1
2
3
4
5
6
7
8
9
1
2
3
4
5
1
2
3
4
对C++来说,编译器会为每个.proto文件生成一个.h文件和一个.cc文件,.proto文件中的每一个消息有一个对应的类。
对Java来说,编译器为每一个消息类型生成了一个.java文件,以及一个特殊的Builder类(该类是用来创建消息类接口
的)。
对Python来说,有点不太一样——Python编译器为.proto文件中的每个消息类型生成一个含有静态描述符的模块,,该模块
与一个元类(metaclass)在运行时(runtime)被用来创建所需的Python数据访问类。
对go来说,编译器会位每个消息类型生成了一个.pd.go文件。
对于Ruby来说,编译器会为每个消息类型生成了一个.rb文件。
javaNano来说,编译器输出类似域java但是没有Builder类
对于ObjectiveC来说,编译器会为每个消息类型生成了一个pbobjc.h文件和pbobjcm文件,.proto文件中的每一个消息有一个
对应的类。
对于C#来说,编译器会为每个消息类型生成了一个.cs文件,.proto文件中的每一个消息有一个对应的类。
你可以从如下的文档链接中获取每种语言更多API(proto3版本的内容很快就公布)。APIReference
标量数值类型
一个标量消息字段可以含有一个如下的类型——该表格展示了定义于.proto文件中的类型,以及与之对应的、在自动生成的访问
类中定义的类型:
.proto
Type
Notes
C++
Type
Java
Type
Python
Type[2]
Go
Type
RubyType
C#
Type
PHPType
double double double float float64 Float double float
float float float float float32 Float float float
int32
使用变长编码,对于负值的效率
很低,如果你的域有可能有负
值,请使用sint64替代
int32 int int int32
Fixnum或者Bignum(根据
需要)
int integer
uint32 使用变长编码 uint32 int int/long uint32
Fixnum或者Bignum(根据
需要)
uint integer
uint64 使用变长编码 uint64 long int/long uint64 Bignum ulong
integer/stri
ng
sint32
使用变长编码,这些编码在负值
时比int32高效的多
int32 int int int32
Fixnum或者Bignum(根据
需要)
int integer
sint64
使用变长编码,有符号的整型
值。编码时比通常的int64高效。
int64 long int/long int64 Bignum long
integer/stri
ng
fixed32
总是4个字节,如果数值总是比总
是比228大的话,这个类型会比
uint32高效。
uint32 int int uint32
Fixnum或者Bignum(根据
需要)
uint integer
fixed64
总是8个字节,如果数值总是比总
是比256大的话,这个类型会比
uint64高效。
uint64 long int/long uint64 Bignum ulong
integer/stri
ng
sfixed3
2
总是4个字节 int32 int int int32
Fixnum或者Bignum(根据
需要)
int integer
sfixed6
4
总是8个字节 int64 long int/long int64 Bignum long
integer/stri
ng
bool bool boolean bool bool TrueClass/FalseClass bool boolean
string
一个字符串必须是UTF8编码或者
7bitASCII编码的文本。
string String str/unicode string String(UTF8) string string
bytes 可能包含任意顺序的字节数据。 string
ByteStri
ng
str []byte String(ASCII8BIT)
ByteStri
ng
string
剩余11页未读,继续阅读
zhoujie277
- 粉丝: 4
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页