首页 > 其他分享 >proto3学习

proto3学习

时间:2022-08-28 14:56:15浏览次数:42  
标签:学习 枚举 proto3 消息 类型 message 默认值 Corpus

转自:https://colobu.com/2017/03/16/Protobuf3-language-guide/#指定字段类型

1.消息message类型

假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果所在的页数,以及每一页多少条查询结果。

syntax = "proto3";//指定使用proto3版本,必须在第一行
message SearchRequest {
  string query = 1;//类型、名字、唯一的标示符
  int32 page_number = 2;
  int32 result_per_page = 3;
}

在消息定义中,每个字段都有唯一的一个数字标识符。这些标识符是用来在消息的二进制格式中识别各个字段的,一旦开始使用就不能够再改变(?什么意思,不能随意更改吗?)。

对C++来说,当用protocol buffer编译器来运行.proto文件时,编译器会为每个.proto文件生成一个.h文件和一个.cc文件,.proto文件中的每一个消息有一个对应的类。

2.类型

2.1 枚举enum

假设要定义一个Corpus的枚举类型,需要:

  1. 在消息格式中添加了一个叫做Corpus的枚举类型——它含有所有可能的值 ——
  2. 以及一个类型为Corpus的字段:
message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {//可以定义在message外部
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
}

 

Corpus枚举的第一个常量映射为0:每个枚举类型必须将其第一个类型映射为0,这是因为:

  • 必须有有一个0值,我们可以用这个0值作为默认值。
  • 这个零值必须为第一个元素,为了兼容proto2语义,枚举类的第一个值总是默认值。

2.2 map

关联映射:

map<key_type, value_type> map_field = N;
  • key_type可以是任意Integer或者string类型
  • value_type可以是任意类型。

2.3 package

可以为.proto文件新增一个可选的package声明符,用来防止不同的消息类型有命名冲突。

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

对于C++,产生的类会被包装在C++的命名空间中,如上例中的Open会被封装在 foo::bar空间中,namespace foo::bar.

在其他的消息格式定义中可以使用包名+消息名的方式来定义域的类型(访问该message类型),如:

message Foo {
  ...
  required foo.bar.Open open = 1;
  ...
}

3.解析默认值

当一个消息被解析的时候,如果被编码的信息不包含一个特定的singular元素,被解析的对象对应的被设置位一个默认值,对于不同类型指定如下:

  • 对于string,默认是一个空string
  • 对于bytes,默认是一个空的bytes
  • 对于bool,默认是false
  • 对于数值类型,默认是0
  • 对于枚举,默认是第一个定义的枚举值,必须为0;
  • 对于消息类型(message),域没有被设置,确切的消息是根据语言确定的;
  • 对于可重复域的默认值是空。

4.与json的映射关系

空值转换关系:

  • 如果JSON编码的数据丢失或者其本身就是null,这个数据会在解析成protocol buffer的时候被表示成默认值。
  • 如果一个字段在protocol buffer中表示为默认值,在转化成JSON的时候忽略掉以节省空间。

 

标签:学习,枚举,proto3,消息,类型,message,默认值,Corpus
From: https://www.cnblogs.com/BlueBlueSea/p/16632759.html

相关文章

  • 低代码平台amis学习 二:写一个页面
    上一节完成了amis的部署,这次来写一个简单页面 如果看过amis入门文档的话,应该知道amis是通过json文件来生成前端页面的,在实际编写json文件的过程中,并不需要自己逐行书写j......
  • 疾速瓜牛 Linux三剑客 之 sed学习与应用
    sed,是streameditor的缩写,顾名思义,就是个非交互式行编辑器,有以下特点:它能执行与编辑器vi和ex相同的编辑任务sed编辑器没有提供交互式使用方式,使用者只能在命令行......
  • JS基础学习(二)操作BOM和DOM
    浏览器对象JavaScript可以获取浏览器提供的很多对象,并进行操作。windowwindow对象不但充当全局作用域,而且表示浏览器窗口。window对象有innerWidth和innerHeight属......
  • Go学习开篇
    1.go介绍21世纪的c语言,本身开发者之一就是c语言的创始人golang是golanguage的简称,我们简称go,是Google开发的一种静态的强类型、编译型、并发型,并具有垃圾回收功能的[......
  • 学习
    #Markdown学习##标题###三级标题####四级标题 ##字体**Hello.World!*****Hello.World!****Hello.World!*~~Hello.World!~~ ##引用>学习java ##分......
  • 【深度学习基本概念】上采样、下采样、卷积、池化
    【深度学习基本概念】上采样、下采样、卷积、池化上采样概念上采样(upsampling):又名放大图像、图像插值;主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上;上......
  • UE4 C++学习 浅析基本数据类型
    本文只解析一些UE4特有的一些数据类型,一些常用的类型如布尔(Bool),整型(Int)等不再赘述。 UE4的基本数据类型有以下几种:   命名(FName):在C++中,命名被写成FName使用......
  • 数据库学习笔记 (本数据库学习笔记以SQL sever 2019 为例进行学习) 20220824 第二节课
    什么是数据模型?数据模型:是对现实世界数据特征的抽象,他是用来描述数据、组织数据和对数据进行操作的。在数据库中用数据模型这个工具来抽象、表示和处理现实世界中的数据......
  • JS基础学习(一)函数和对象
    函数定义方式1.第一种functionabs(x){if(x>=0){returnx;}else{return-x;}}2.第二种变量赋值的形式,注意最后有一个分号";......
  • 树哈希 学习笔记
    1.做法(frompeehs_moorhsum)设\(h(u)\)表示一个点的哈希值,\(f\)为一随机函数。\(h(u)=1+\sum\limits_{v\inson_{u}}f(h(v))\)首先\(f\)的选择大概率是随机的,只要......