介绍一下消息的不同类型和引用

使用复杂消息类型

您可以使用其他消息类型作为字段类型。例如,假设你想在每个SearchResponse消息中包含Result消息,您可以在同一个.proto中定义一个Result消息类型,然后在SearchResponse中指定一个Result类型的字段:

1
2
3
4
5
6
7
8
9
message SearchResponse {
repeated Result results = 1;
} message Result {
string url = 1;
string title = 2;
repeated string snippets = 3;
}

引入其他消息文件

在上述示例中,Result消息类型与SearchResponse在相同的文件中定义, 如果要使用的消息类型已经在另一个.proto文件中定义了怎么解决呢?

你可以通过import引入其他的.proto文件:

1
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",就可以了

import对proto2和proto3都适用

嵌套类型

您可以在其他消息类型中定义和使用消息类型,如下,Result消息定义在SearchResponse消息中:

1
2
3
4
5
6
7
8
message SearchResponse {
message Result {
string url = 1;
string title = 2;
repeated string snippets = 3;
}
repeated Result results = 1;
}

如果想重复使用Result,可以用Parent.Type的方式使用:

1
2
3
message AnotherResponse {
SearchResponse.Result res = 1;
}

修改更新现有的消息格式

修改时要注意的规则:

  1. 不要改变已经存在字段的标签
  2. 添加一个字段时,旧的消息将会收到这个字段的默认值
  3. 删除一个字段时,记得把该字段的标签添加到reserved里
  4. int32,uint32,int64,uint64和bool都是兼容的。这意味着您可以将这些类型之一的字段更改为另一个,而不会破坏前向或后向兼容性。转 大专栏  Protocol Buffers学习(4):更多消息类型换过程相当于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

1
2
3
4
5
6
import "google/protobuf/any.proto";

message ErrorStatus {
string message = 1;
repeated google.protobuf.Any details = 2;
}

Oneof类型

Oneof结构中有多个字段,但是同一时刻只有一个字段生效

定义oneof结构

1
2
3
4
5
6
message SampleMessage {
oneof test_oneof {
string name = 4;
SubMessage sub_message = 9;
}
}

oneof中可以是任意类型,除了repeated 字段

生成代码之后,也会对oneof字段生成getter,setter方法,但是出来的值需要你自己判断一下

Maps 类型

如果你要定义一个map,protobuf提供了一个语法:

1
map<key_type, value_type> map_field = N;

例如

1
map<string, Project> projects = 3;

注意事项

  • Map字段不能是repeated
  • Map中的集合是无序的
  • .proto文件生成时,map按key排序
  • 解析或者合并时,后边的会覆盖前边的

packages语法

你可以添加一个可选标识package到.proto文件中。用来防止命名冲突

1
2
package foo.bar;
message Open { ... }

在使用这条消息的时候需要加上package名字

1
2
3
4
5
message Foo {
...
foo.bar.Open open = 1;
...
}

Protocol Buffers学习(4):更多消息类型的更多相关文章

  1. Protocol Buffers学习笔记

    Protocol Buffers学习笔记 1. 简介 Protocol Buffers是google发明的一种数据交换格式,独立于语言,独立于平台.与其他的数据交换格式有所不同,Protocol Bu ...

  2. Protocol Buffers学习教程

    最近看公司代码的过程中,看到了很多proto后缀的文件,这是个啥玩意?问了大佬,原来这是Protocol Buffers! 这玩意是干啥的?查完资料才知道,又是谷歌大佬推的开源组件,这玩意完全可以取代 ...

  3. Google Protocol Buffers学习

    参考资料:http://www.cnblogs.com/royenhome/archive/2010/10/29/1864860.html 参考资料:http://www.jianshu.com/p/ ...

  4. Protocol Buffers官方文档(proto3语言指南)

    本文是对官方文档的翻译,大部分内容都是引用其他一些作者的优质翻译使文章内容更加通俗易懂(自己是直译,读起来有点绕口难理解,本人英文水平有限),参考的文章链接在文章末尾 这篇指南描述如何使用protoc ...

  5. ProtoBuf3语法指南(Protocol Buffers)_上

    0.说明 ProtoBuf3语法指南, 又称为proto3, 是谷歌的Protocol Buffers第3个版本. 本文基于官方英文版本翻译, 加上了自己的理解少量修改, 一共分为上下两部分. 1.序 ...

  6. Language Guide (proto3) | proto3 语言指南(一)定义消息类型

    定义消息类型 首先让我们看一个非常简单的例子.假设您想定义一个搜索请求消息格式,其中每个搜索请求都有一个查询字符串.您感兴趣的特定结果页以及每页的结果数.下面是用于定义.proto消息类型的文件. s ...

  7. rabbitMQ学习笔记(六) topic类型消息。

    上一节中使用了消息路由,消费者可以选择性的接收消息. 但是这样还是不够灵活. 比如某个消费者要订阅娱乐新闻消息 . 包括新浪.网易.腾讯的娱乐新闻.那么消费者就需要绑定三次,分别绑定这三个网站的消息类 ...

  8. gRPC in ASP.NET Core 3.x -- Protocol Buffer(3)更新消息类型

    当你第一次定义Protocol Buffer的消息的时候,你肯定会给消息设定一套规则需求.但是随着时间的推进,你的业务可能会发生了变化,与此同时,你的Protocol Buffer消息类型的需求也会随 ...

  9. 学习ActiveMQ(五):activemq的五种消息类型和三种监听器类型

    一.前面我们一直发送的是字符串类型,其实activemq一共支持五种消息类型: 1.String消息类型:发送者:消费者: 1.String消息类型:发送者:消费者: 1.String消息类型:发送者 ...

随机推荐

  1. [原]C++新标准之std::ratio

    原 总结 ratio  概览 类定义 预定义ratio 应用 示例代码 参考资料 概览 std::ratio定义在<ratio>文件中,提供了编译期的比例计算功能.为std::chrono ...

  2. Python dict 字典 keys和values对换

    原字典: d1 = { 'en':'英语', 'cn':'中文', 'fr':'法语', 'jp':'日语' } 经过相互对换: d1_inverse = {values:keys for keys, ...

  3. MobileNets: Open-Source Models for Efficient On-Device Vision

    https://research.googleblog.com/2017/06/mobilenets-open-source-models-for.html  Wednesday, June 14, ...

  4. NSPredicate 应用

    //查询单词里面包含“ang”的字符串 NSArray *array = [[NSArray alloc]initWithObjects:@"beijing",@"sha ...

  5. 20190221 beautiful soup 入门

    beautiful soup 入门 Beautiful Soup 是 python 的一个库,最主要的功能是从网页抓取数据. Beautiful Soup 自动将输入文档转换为 Unicode 编码, ...

  6. 金蝶cloud成本核算流程

  7. itext实现横向pdf打印内容

    Document doc = new Document(PageSize.A4); 这个是用PageSize.A4设置的是纵向A4大小 进入 com.itextpdf.text.PageSize的源码 ...

  8. mysql创建某个数据库中的某张表 只读用户

    1.创建用户,并授权SELECT查询权限,授权远程访问权限,注意,命令中username/password指用户名密码,请自己指定.若要限制仅指定IP可以使用此用户访问Mysql,将%改为具IP即可, ...

  9. Hibernate实现分页查询

    分页查询就是把数据库中某张表的记录数进行分页查询,在做分页查询时会有一个Page类,下面是一个Page类,我对其做了详细的注解: 1 package com.entity; 2 /** 3 * @au ...

  10. 邪恶的csrf

    关于csrf是啥我就不多说了 进入正文 场景模拟 场景一 在一个bbs社区里,用户在发言的时候会发出一个这样的GET请求: #!html GET /talk.php?msg=hello HTTP/1. ...