google_protobuf数据类型

2023-11-04

原文链接:google_protobuf数据类型

要通信,必须有协议,否则双方无法理解对方的码流。在protobuf中,协议是由一系列的消息组成的。因此最重要的就是定义通信时使用到的消息格式。

  • Protobuf消息定义

消息由至少一个字段组合而成,类似于C语言中的结构。每个字段都有一定的格式。

字段格式:限定修饰符① | 数据类型② | 字段名称③ | = | 字段编码值④ | [字段默认值⑤]

①.限定修饰符包含 required\optional\repeated

Required: 表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值,对于接收方,必须能够识别该字段的意思。发送之前没有设置required字段或者无法识别required字段都会引发编解码异常,导致消息被丢弃。

Optional:表示是一个可选字段,可选对于发送方,在发送消息时,可以有选择性的设置或者不设置该字段的值。对于接收方,如果能够识别可选字段就进行相应的处理,如果无法识别,则忽略该字段,消息中的其它字段正常处理。—因为optional字段的特性,很多接口在升级版本中都把后来添加的字段都统一的设置为optional字段,这样老的版本无需升级程序也可以正常的与新的软件进行通信,只不过新的字段无法识别而已,因为并不是每个节点都需要新的功能,因此可以做到按需升级和平滑过渡。

Repeated:表示该字段可以包含0~N个元素。其特性和optional一样,但是每一次可以包含多个值。可以看作是在传递一个数组的值。

②.数据类型

Protobuf定义了一套基本数据类型。几乎都可以映射到C++\Java等语言的基础数据类型.
在这里插入图片描述

N 表示打包的字节并不是固定。而是根据数据的大小或者长度。

例如int32,如果数值比较小,在0~127时,使用一个字节打包。

关于枚举的打包方式和uint32相同。

关于message,类似于C语言中的结构包含另外一个结构作为数据成员一样。

关于 fixed32 和int32的区别。fixed32的打包效率比int32的效率高,但是使用的空间一般比int32多。因此一个属于时间效率高,一个属于空间效率高。根据项目的实际情况,一般选择fixed32,如果遇到对传输数据量要求比较苛刻的环境,可以选择int32.

③.字段名称

字段名称的命名与C、C++、Java等语言的变量命名方式几乎是相同的。

protobuf建议字段的命名采用以下划线分割的驼峰式。例如 first_name 而不是firstName.

④.字段编码值

有了该值,通信双方才能互相识别对方的字段。当然相同的编码值,其限定修饰符和数据类型必须相同。

编码值的取值范围为 1~2^32(4294967296)。

其中 1~15的编码时间和空间效率都是最高的,编码值越大,其编码的时间和空间效率就越低(相对于1-15),当然一般情况下相邻的2个值编码效率的是相同的,除非2个值恰好实在4字节,12字节,20字节等的临界区。比如15和16.

1900~2000编码值为Google protobuf 系统内部保留值,建议不要在自己的项目中使用。

protobuf 还建议把经常要传递的值把其字段编码设置为1-15之间的值。

消息中的字段的编码值无需连续,只要是合法的,并且不能在同一个消息中有字段包含相同的编码值。

建议:项目投入运营以后涉及到版本升级时的新增消息字段全部使用optional或者repeated,尽量不实用required。如果使用了required,需要全网统一升级,如果使用optional或者repeated可以平滑升级。

⑤.默认值。当在传递数据时,对于required数据类型,如果用户没有设置值,则使用默认值传递到对端。当接受数据是,对于optional字段,如果没有接收到optional字段,则设置为默认值。

  • 关于import

protobuf 接口文件可以像C语言的h文件一个,分离为多个,在需要的时候通过 import导入需要对文件。其行为和C语言的#include或者java的import的行为大致相同。

  • 关于package

避免名称冲突,可以给每个文件指定一个package名称,对于java解析为java中的包。对于C++则解析为名称空间。

  • 关于message

支持嵌套消息,消息可以包含另一个消息作为其字段。也可以在消息内定义一个新的消息。

  • 关于enum

枚举的定义和C++相同,但是有一些限制。

枚举值必须大于等于0的整数。

使用分号(;)分隔枚举变量而不是C++语言中的逗号(,)

eg.

enum VoipProtocol 

{

    H323 = 1;

    SIP  = 2;

    MGCP = 3;

    H248 = 4;

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

google_protobuf数据类型 的相关文章

  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • vscode配置远程ssh环境

    安装 Oracle VM VirtualBox 安装ubuntu ubuntu上安装ssh sever 百度搜索 ubuntu 18 04上安装ssh sever 58条消息 安装Ubuntu18 04并配置ssh服务 ubuntu18 0
  • WIN7 64位 VS2013下载

    下载网址 https msdn itellyou cn 复制到迅雷进行下载
  • SVG脚本编程介绍

    SVG脚本编程介绍 一 人气 13720 Svg脚本编程简介 一 本文主要介绍SVG的脚本编程 并分别给出放大 缩小 查询 鼠标事件等实例 一 SVG简介 SVG 全称为Scalable Vector Graphics 可伸缩矢量图形 它是
  • stm32之DS18B20

    DS18B20与stm32之间也是通过单总线进行数据的传输的 单总线协议在DHT11中已经介绍过 虽说这两者外设都是单总线 但时序电路却很不一样 DS18B20是更为麻烦一点的 DS18B20 举例 原码补码反码转换 原码反码补码转换 王小
  • 调试最长的一帧(第12天)

    先看看总体 流程走到了更新分页数据库 分页数据库的数据流图 先找上图的4个成员变量 上图中 左侧的图框表示数据的检索和输入 中间的白色图框表示用于数据存储的内存空间 而右边的图框表示存储数据的输出 此外 蓝绿色图框表示可以在DataBase
  • Qt版本企业级界面

    百度云盘 链接 https pan baidu com s 11b634VvKMIsGdahyBLpZ3Q 提取码 6666
  • 用python语言画一个动态爱心

    使用 Python 语言画一个动态爱心可以使用多种库 如 Matplotlib pygame 等 具体步骤如下 安装相应库 如 Matplotlib pipinstall matplotlib 使用 Matplotlib 的函数绘制爱心形状
  • LINUX开机和关机

    本节将主要讲解LINUX开机和关机 希望通过本书的内容能帮助读者建立正确的开机和关机概念 并且一睹LINUX的风彩 本章的主要内容 1 系统开机 2 系统关机 3 系统登录 4 系统注销 5 编辑器长青树 系统开机 开机信息相当重要 因为它
  • 信息系统开发与管理(自考)往届题目复习

    信息系统开发与管理 信息系统开发与管理 简答题 选择题解析 day2 名词解释 day3 day4 信息系统开发与管理 简答题 战略型管理信息系统 主要服务于高层管理者 主要目的是为了战略计划的制订和调整提供辅助决策的功能 简述管理信息系统
  • Java Thread.yield()方法具有什么功能呢?

    转自 Java Thread yield 方法具有什么功能呢 下文讲述Thread yield 方法的功能简介说明 如下所示 Thread yield 方法的功能 暂停当前线程 将当前线程重新放回CPU的调度中心 yield 方法注意事项
  • Leetcode 刷题笔记:哈希表篇

    基本概念 哈希表 根据关键码的值而直接进行访问的数据结构 那么哈希表能解决什么问题呢 一般哈希表都是用来快速判断一个元素是否出现集合里 哈希函数 哈希碰撞 一般哈希碰撞有两种解决方法 拉链法和线性探测法 常见的三种哈希结构 数组array
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 计操理论课10 -- openEuler实验第九章内核虚拟化

    文章目录 任务一 搭建openEuler系统的qemu虚拟机 知识点 实验过程 任务二 搭建使用docker 知识点 1 Docker Engine 2 Docker对象 3 Dockerfile 知识点 删除容器 创建自定义镜像并以此为基
  • TCP/IP详解 卷1:协议 学习笔记 第二十一章 TCP的超时与重传

    TCP发送的数据和确认都可能丢失 TCP通过在发送时设置一个定时器来解决这种问题 当定时器溢出时还没收到确认 它就重传该数据 对于每个连接 TCP管理4个不同定时器 1 重传定时器用于希望收到另一端的确认 2 坚持定时器使窗口大小信息保持不
  • android修改checkbox样式边框颜色

    s之前写了一个自动登录和记住密码的功能 用的是checkbox控件 但是原生控件边框样式不太符合要求 如图 我想修改成白色 在网上查了一些资料 说在style xml文件中定义一个样式
  • 全景图像拼接——基本流程

    图像拼接技术是数字图像处理技术一个重要的研究方向 它即是将两幅或多幅相互有部分重叠的场景照片拼接成具有超宽视角 与原始图像接近且失真小 没有明显缝合线的高分辨率图像 可以很好地解决广角镜 鱼眼镜头等全景图获取设备的不足 如下图 图像拼接产生
  • Spring Boot 结合Spring Cache三大注解(@Cacheable,@CachePut,@CacheEvict)做缓存使用

    Spring Cache是一个框架 实现了基于注解的缓存功能 只需要简单地加一个注解 就能实现缓存功能 大大简化我们在业务中操作缓存的代码 注解 EnableCaching 开启缓存注解功能 Cacheable 在方法执行前spring先查
  • springsecurtity的login方法不跳转_微信小程序页面跳转教程

    如何实现微信小程序跳转功能 首先你得有一个已发布成功的小程序 这里简单给大家说明下如何发布 选一个简单的小程序制作工具 如 上线了 sxl cn 注册好账号后选择 创建小程序 再选一个超级云名片 或者电商 展示 模板 然后你可以在 小程序设
  • shiro配置文件shiro.ini简介说明

    转自 shiro配置文件shiro ini简介说明 下文笔者讲述shiro配置文件shiro ini的简介说明 如下所示 shiro ini 是一个shiro的配置文件 它通常放在classpath路径下 shiro ini配置文件包含以下
  • google_protobuf数据类型

    原文链接 google protobuf数据类型 要通信 必须有协议 否则双方无法理解对方的码流 在protobuf中 协议是由一系列的消息组成的 因此最重要的就是定义通信时使用到的消息格式 Protobuf消息定义 消息由至少一个字段组合