Protocol Buffers 学习(4):更多消息类型

栏目: 服务器 · 发布时间: 6年前

内容简介: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 (随便举例),我们有两种解决办法:

  1. 修改 a.proto 中的 import 语句,直接 import "test/b.proto"
  2. b.proto 文件原来的位置,创建一个 b.proto 文件,文件内容为 import public "test/b.proto" ,就可以了

importproto2proto3 都适用

嵌套类型

您可以在其他消息类型中定义和使用消息类型,如下, 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;
}

修改更新现有的消息格式

修改时要注意的规则:

  1. 不要改变已经存在字段的标签
  2. 添加一个字段时,旧的消息将会收到这个字段的默认值
  3. 删除一个字段时,记得把该字段的标签添加到 reserved
  4. int32,uint32,int64,uint64和bool都是兼容的。这意味着您可以将这些类型之一的字段更改为另一个,而不会破坏前向或后向兼容性。转换过程相当于C ++中将该数字转换为该类型(例如,如果将64位数字读为int32, 它将被截断到32位)
  5. sint32和sint64相互兼容,但与其他整数类型不兼容
  6. 只要字节是有效的UTF-8,字符串和字节是兼容的
  7. 嵌套消息(message)与包含消息的编码版本的字节(bytes)兼容【表述不清,欢迎大家评论指正】
  8. fixed32与sfixed32兼容,fixed64与sfixed64兼容
  9. 枚举兼容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;
  ...
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

风向

风向

何宝宏 / 人民邮电出版社 / 2019-1 / ¥68.00元

★这是处于不断变化的互联网时代,行业从业者与非专业从业者都应阅读的解惑之书。 ★揭示互联网思想和精神的“内核”,帮助更多人了解互联网基因。 ★看清人工智能、区块链、大数据、云计算等技术发展的规律和机会。 ★为投资者、创业者提供方向,为广大技术从业者了解技术,为就业择业者提供建议和参考。 ★中国信通院院长刘多、腾讯云总裁邱跃鹏做序推荐。 ★中国工程院院士邬贺铨、中国科学......一起来看看 《风向》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具