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

使用复杂消息类型

您可以使用其他消息类型作为字段类型。例如,假设你想在每个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",就可以了

importproto2proto3都适用

嵌套类型

您可以在其他消息类型中定义和使用消息类型,如下,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. HNOI2018/AHOI2018 游戏

    这题放过了暴力其实就没啥意思了 虽然暴力复杂度很玄学,但是思维水平确实没啥 Description link 题意概述:现在有一条长度为 \(n\) 的链,有些边是有限制的 限制为能到某个点,才能经过 ...

  2. 可视化---seaborn

    变量说明 x,y,hue 数据集变量 变量名 date 数据集 数据集名 row,col 更多分类变量进行平铺显示 变量名 col_wrap 每行的最高平铺数 整数 estimator 在每个分类中进 ...

  3. 了解Kafka生产者

    了解Kafka生产者 ​ 之前对kafka的整体架构有浅显的了解,这次正好有时间,准备深入了解一下kafka,首先先从数据的生产者开始吧. 生产者的整体架构 ​ 可以看到整个生产者进程主要由两个线程进 ...

  4. 解决在Anaconda中的cv2在pycharm中不可使用的问题

    在Anaconda中已经安装好的opencv模块在pycharm中却不能正常使用,后来发现是pycharm使用的python环境中没有opencv的包,解决方法有两种: 方法一 在pycharm的设置 ...

  5. List集合分组依据集合中对象的属性

    直接上代码 用到了Spring的BeanWrapper类 public static <T, K> Map<K, List<T>> groupByProperty( ...

  6. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  7. C# 创建、部署和调用WebService的简单示例 (转)

    C# 创建.部署和调用WebService的简单示例(转)  转自 https://www.cnblogs.com/Brambling/p/7266482.html  webservice 可以用于分 ...

  8. python tricks 01

    01: 考察range/sort/lambda 对以下数据进行排序 原数据: [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5] 目标数据: [0, -1, 1, -2, 2 ...

  9. Django数据库查询优化-事务-图书管理系统的搭建

    数据库查询优化 优化:虽然减轻了数据库的压力,但查询速度大大的减慢 ORM内所有的语句操作,默认都是惰性查询,只有你在真正的需要数据的时候才会走数据, 如果你只是写ORM语句时,是不会走数据库的,这样 ...

  10. Opencv笔记(十七)——轮廓性质

    边界矩形的宽高比 x,y,w,h = cv2.boundingRect(cnt) aspect_ratio = float(w)/h Extent Extent就是轮廓面积与边界矩形面积的比. are ...