内容简介:Protocol Buffers 学习(4):更多消息类型
介绍一下消息的不同类型和引用
使用复杂消息类型
您可以使用其他消息类型作为字段类型。例如,假设你想在每个 SearchResponse
消息中包含 Result
消息,您可以在同一个 .proto
中定义一个 Result
消息类型,然后在 SearchResponse
中指定一个 Result
类型的字段:
message SearchResponse { repeated Result results = 1; } message Result { string url = 1; string title = 2; repeated string snippets = 3; }
引入其他消息文件
在上述示例中, Result
消息类型与 SearchResponse
在相同的文件中定义, 如果要使用的消息类型已经在另一个 .proto
文件中定义了怎么解决呢?
你可以通过 import
引入其他的 .proto
文件:
import "myproject/other_protos.proto";
注意
接上边的例子,假如 a.proto
引入了 b.proto
,但是 b.proto
更换了位置,路径变成了 test/b.proto
(随便举例),我们有两种解决办法:
-
修改
a.proto
中的import
语句,直接import "test/b.proto"
-
在
b.proto
文件原来的位置,创建一个b.proto
文件,文件内容为import public "test/b.proto"
,就可以了
import
对 proto2
和 proto3
都适用
嵌套类型
您可以在其他消息类型中定义和使用消息类型,如下, Result
消息定义在 SearchResponse
消息中:
message SearchResponse { message Result { string url = 1; string title = 2; repeated string snippets = 3; } repeated Result results = 1; }
如果想重复使用 Result
,可以用 Parent.Type
的方式使用:
message AnotherResponse { SearchResponse.Result res = 1; }
修改更新现有的消息格式
修改时要注意的规则:
- 不要改变已经存在字段的标签
- 添加一个字段时,旧的消息将会收到这个字段的默认值
-
删除一个字段时,记得把该字段的标签添加到
reserved
里 - int32,uint32,int64,uint64和bool都是兼容的。这意味着您可以将这些类型之一的字段更改为另一个,而不会破坏前向或后向兼容性。转换过程相当于C ++中将该数字转换为该类型(例如,如果将64位数字读为int32, 它将被截断到32位)
- sint32和sint64相互兼容,但与其他整数类型不兼容
- 只要字节是有效的UTF-8,字符串和字节是兼容的
- 嵌套消息(message)与包含消息的编码版本的字节(bytes)兼容【表述不清,欢迎大家评论指正】
- fixed32与sfixed32兼容,fixed64与sfixed64兼容
- 枚举兼容int32,uint32,int64和uint64(请注意,如果值不合适,那么值将被截断)。 但是请注意,客户端代码可以在消息反序列化时对它们进行不同的处理:例如,消息中将保留无法识别的proto3枚举类型,但是当消息反序列化时,如何处理和使用的编程语言相关。 Int字段始终保持其值
Any
类型
any类型时谷歌protobuf内置的一个类型,通用类型,使用的时候需要导入 google/protbuf/any.proto
import "google/protobuf/any.proto"; message ErrorStatus { string message = 1; repeated google.protobuf.Any details = 2; }
Oneof
类型
Oneof结构中有多个字段,但是同一时刻只有一个字段生效
定义oneof结构
message SampleMessage { oneof test_oneof { string name = 4; SubMessage sub_message = 9; } }
oneof中可以是任意类型,除了repeated 字段
生成代码之后,也会对oneof字段生成getter,setter方法,但是出来的值需要你自己判断一下
Maps 类型
如果你要定义一个map,protobuf提供了一个语法:
map<key_type, value_type> map_field = N;
例如
map<string, Project> projects = 3;
注意事项
-
Map字段不能是
repeated
- Map中的集合是无序的
-
.proto
文件生成时,map按key排序 - 解析或者合并时,后边的会覆盖前边的
packages语法
你可以添加一个可选标识 package
到 .proto
文件中。用来防止命名冲突
package foo.bar; message Open { ... }
在使用这条消息的时候需要加上 package
名字
message Foo { ... foo.bar.Open open = 1; ... }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- RocketMQ 常用消息类型
- Protocol Buffers 学习(4):更多消息类型
- 消息队列Rabbitmq的交换器类型
- Kafka实践:到底该不该把不同类型的消息放在同一个主题中
- 没有找到Java类…和MIME媒体类型text / html的消息体编写器
- eclipse – 泽西:没有找到Java类和MIME媒体类型application / json的消息体编写器
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Smashing Book
Jacob Gube、Dmitry Fadeev、Chris Spooner、Darius A Monsef IV、Alessandro Cattaneo、Steven Snell、David Leggett、Andrew Maier、Kayla Knight、Yves Peters、René Schmidt、Smashing Magazine editorial team、Vitaly Friedman、Sven Lennartz / 2009 / $ 29.90 / € 23.90
The Smashing Book is a printed book about best practices in modern Web design. The book shares technical tips and best practices on coding, usability and optimization and explores how to create succes......一起来看看 《The Smashing Book》 这本书的介绍吧!
RGB转16进制工具
RGB HEX 互转工具
URL 编码/解码
URL 编码/解码