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;
  ...
}

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

查看所有标签

猜你喜欢:

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

Numerical Linear Algebra

Numerical Linear Algebra

Lloyd N. Trefethen、David Bau III / SIAM: Society for Industrial and Applied Mathematics / 1997-06-01 / USD 61.00

Numerical Linear Algebra is a concise, insightful, and elegant introduction to the field of numerical linear algebra.一起来看看 《Numerical Linear Algebra》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换