Protobuf(二)proto3语法格式

2023-11-09

.proto文件有两种语法标准:proto2和proto3,我们以proto3为例,其语法格式如下:

message  <message_name> {
  <filed_rule>  <filed_type> <filed_name> = <field_number> 
       规则          类型          名称           编号  
}
  • message_name: 同一个pkg内,必须唯一
  • filed_rule: 可以没有, 常用的有repeated, oneof
  • filed_type: 数据类型, protobuf定义的数据类型, 生产代码的会映射成对应语言的数据类型
  • filed_name: 字段名称, 同一个message 内必须唯一
  • field_number: 字段的编号, 序列化成二进制数据时的字段编号

2.1.1、字段规则
 

2.1.2、字段类型

基础类型

参考官方文档(Language Guide (proto3)  |  Protocol Buffers  |  Google Developers),我这里只保留了我常用编程语言的字段类型

.proto Type Notes C++ Type Python Type[3] C# Type
double double float double
float float float float
int32 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. int32 int int
int64 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. int64 int/long[4] long
uint32 Uses variable-length encoding. uint32 int/long[4] uint
uint64 Uses variable-length encoding. uint64 int/long[4] ulong
sint32 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. int32 int int
sint64 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. int64 int/long[4] long
fixed32 Always four bytes. More efficient than uint32 if values are often greater than 228. uint32 int/long[4] uint
fixed64 Always eight bytes. More efficient than uint64 if values are often greater than 256. uint64 int/long[4] ulong
sfixed32 Always four bytes. int32 int int
sfixed64 Always eight bytes. int64 int/long[4] long
bool bool bool bool
string A string must always contain UTF-8 encoded or 7-bit ASCII text, and cannot be longer than 232. string str/unicode[5] string
bytes May contain any arbitrary sequence of bytes no longer than 232. string str (Python 2)
bytes (Python 3)
ByteString

枚举类型

语法如下:

enum <enum_name> {
    <element_name> = <element_number>
}
  • enum_name: 枚举名称
  • element_name: pkg内全局唯一, 很重要
  • element_number: 必须从0开始, 0表示类型的默认值, 32-bit integer

如下示例,Corpus就是我们定义的一个枚举类型。

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
}

如果需要将不同的枚举常量映射到相同的值。将allow_alias选项设置为true即可。(最好不要这么使用)

message MyMessage1 {
  enum EnumAllowingAlias {
    option allow_alias = true;
    UNKNOWN = 0;
    STARTED = 1;
    RUNNING = 1;
  }
}
message MyMessage2 {
  enum EnumNotAllowingAlias {
    UNKNOWN = 0;
    STARTED = 1;
    // RUNNING = 1;  // Uncommenting this line will cause a compile error inside Google and a warning message outside.
  }
}

2.1.3、字段编号
 

2.1.4、综合示例

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

Protobuf(二)proto3语法格式 的相关文章

  • 使用make check校对protobuf是否安装成功时出现 undefined reference to regfreeA

    这是因为出现了boost的安装库regex h与系统自带的regex h重复冲突了 可以使用env命令查看当前所有的环境变量 xff0c 看使用的是哪个地方的boost xff0c 然后将相应地方的regex h变换一个名字就行了 然后再m
  • Netty使用Google Protobuf进行编解码

    文章目录 一 概述1 编解码基础2 Netty编解码器3 Protobuf概述 二 Protobuf基本使用1 引入jar包2 下载Protobuf3 编写Student proto4 生成StudentPOJO类5 服务器端6 客户端7
  • 消息序列化工具-protobuf介绍及安装使用技巧

    简介 protobuf是google团队开发的用于高效存储和读取结构化数据的工具 xml json也可以用来存储此类结构化数据 xff0c 但是使用protobuf表示的数据能更加高效 xff0c 并且将数据压缩得更小 xff0c 大约是j
  • golang gRPC:根据.protobuf文件生成go代码

    文章目录 golang gRPC xff1a 根据 protobuf文件生成go代码根据 protobuf文件生成go代码根据proto生成go放在什么位置是最佳实践ProtoBuf 生成 Go 代码去掉 JSON tag omitempt
  • Protobuf生成Go代码指南

    这个教程中将会描述protocol buffer编译器通过给定的 proto会编译生成什么Go代码 教程针对的是proto3版本的protobuf 在阅读之前确保你已经阅读过Protobuf语言指南 编译器调用 Protobuf核心的工具集
  • protobuf详解

    1 protobuf 简介 protobuf protocol buffer 是谷歌内部的混合语言数据标准 通过将结构化的数据进行序列化 串行化 xff0c 用于通讯协议 数据存储等领域和语言无关 平台无关 可扩展的序列化结构数据格式 我们
  • protobuf的序列化和反序列化的分析

    一 protobuf的optional 数据类型序列化分析 1 optional 的protobuf的文件 格式 syntax proto2 message test proto optional int32 proto1 1 option
  • mac下编译protobuf c++

    由于protobuf官网的文档是英文版的 并且并没有比较详细的说明 可能说得很清楚了 只是我这种英文渣看不懂 学习起来着实费了一翻功夫 在此 记录一下学习过程 希望尽量详细 一 编译过程需要的工具 1 protobuf源码 下载地址 htt
  • 【Protobuf(四)】消息格式

    protobuf是一种平台语言无关的消息序列化协议 相比于传统的json xml 序列后的空间更小 但是无法自解释 需要结合额外的proto定义文件才能反序列化 当然这样也更安全 下面记录一下protobuf消息格式 protobuf消息序
  • Protobuf(Protocol Buffers)超详细入门教程(跨平台序列化, Java)——更新于2022.01

    目录 相关教程 相关文献 安装 C Installation Unix 环境 Protobuf3 0基础上手例子 相关教程 Protobuf Protocol Buffers 超详细入门教程 跨平台序列化 C CMake 更新于2022 0
  • gRPC的介绍、安装与使用

    1 gRPC是什么 在 gRPC里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法 使得您能够更容易地创建分布式应用和服务 与许多 RPC系统类似 gRPC也是基于以下理念 定义一个服务 指定其能够被远程调用的方法
  • protobuf 中复合数据类型的读写

    背景 protobuf 在生成的 C 代码中为 proto 文件中的每个 message 生成了对应的 C 类 并提供了数据成员的读写方法 message 类型读写 message 示例 message Point double lng 1
  • ProtoBuf(Google Protocol Buffers)—— C++开发具体教程

    ProtoBuf C 开发 教程 C 开发 教程 1 定义你的 protocol 格式 1 1 protocol 字段格式 1 2 指定字段规则 1 3 proto文件 2 编译你的 Protocol Buffers 3 The Proto
  • protobuf-IOS简单总结(编译、环境搭建)

    什么是protobuf Protocol Buffers are a way of encoding structured data in an efficient yet extensible format Google uses Pro
  • Protobuf在java中的简单使用实例

    TTprotobuf是一种跨语言的数据转换协议 由google开源的 已支持大部份语言 在一般的数据交互过程中都是使用json xml等来做数据的转换 这其中涉及复杂的解析与序列化反序列化问题 如果在大量数据并发请求时 也会导致性能问题 p
  • protobuf安装教程

    protobuf安装 一 Windows下安装 下载protobuf 配置环境变量 检查是否安装成功 二 Linux下安装 下载protobuf 安装protobuf 检查是否安装成功 一 Windows下安装 下载protobuf 下载地
  • C++使用protobuf实现序列化与反序列化

    一 protobuf简介 1 1 protobuf的定义 protobuf是用来干嘛的 protobuf是一种用于 对结构数据进行序列化的工具 从而实现 数据存储和交换 主要用于网络通信中 收发两端进行消息交互 所谓的 结构数据 是指类似于
  • Protobuf安装步骤

    今天看Brpc开源代码的时候 看到了里面提到了google开源的protobuf的数据序列化和反序列工具 所以特地下了源码 试着看下一个简单的使用过程 1 protobuf的介绍 google protobuf是一个灵活的 高效的用于序列化
  • Protobuf 向后兼容性以及 proto3 与 proto2

    Protobuf 的卖点之一是向后兼容性 即开发人员可以改进格式 而老客户端仍然可以使用它 现在有了名为 proto3 的新 Protobuf 版本 IDL 语言本身不兼容 例如options required删除的地方是枚举的新语法 没有
  • gRPC / Protobuf 接口版本控制

    假设我们使用 gRCP Protobuf 来连接许多应用程序 这些应用程序是由他们自己的团队以自己的速度开发和发布的 随着时间的推移 同一应用程序将出现不同版本 例如 安装在用户 PC 上的桌面应用程序 它们在定义的界面上使用不同的版本 虽

随机推荐

  • 开源资产管理系统

    真正的大师 永远都怀着一颗学徒的心 一 项目简介 今天给大家推荐一个开源的资产管理系统 对于一个公司而言 对资产的记录是一件很重要的事情 短时间你可能知道一个电脑 一个打印机放在什么地方 但是随着时间的推移 对于一个公司老人来说你都很难找到
  • 用node.js 实现一个简单的接口

    使用 Node js 可以方便地创建简单的接口 下面是一个使用 Node js 和 Express 框架创建简单接口的示例 首先 确保已经安装了 Node js 和 npm Node js 包管理器 1 创建一个新的文件夹 并在文件夹中打开
  • 华为od机试 C++ 地址分割

    题目 你的任务是编写一个程序 该程序将接收一个由逗号分隔的字符串 其中包含一个URL的前缀和后缀 然后将它们合并成一个完整的URL 合并规则如下 如果前缀的最后一个字符是斜杠 则删除它 如果后缀的第一个字符是斜杠 则删除它 在处理过的前缀和
  • 很诡异的问题——Jenkins与svn代码冲突之解决方法

    今天遇到一个很诡异的问题 可能是我刚刚接触jenkins的原因 导致这个问题困扰了我半个小时 不管怎么样 我还是记录下来 希望能帮助到那些和我一样刚刚接触jenkins的小伙伴 我从idea修改了两个配置文件 提交到svn 然后jenkin
  • mac上安装brew(最简易)

    我们使用linux下有yum mac相应的是brew 安装软件 brew的安装目录在 usr local Cellar 我们以安装nodejs为例子 只需要执行 brew install nodejs 就安装完了 就这么简单 接下来我们安装
  • java开源 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城 小程序商城搭建

    1 涉及平台 平台管理 商家端 PC端 手机端 买家平台 H5 公众号 小程序 APP端 IOS Android 微服务平台 业务服务 2 核心架构 Spring Cloud Spring Boot Mybatis Redis 3 前端框架
  • M1 电脑使用nvm 管理node

    1 执行下面的代码创建文件 bash profile touch bash profile 2 下载安装 curl o https raw githubusercontent com nvm sh nvm v0 35 2 install s
  • 从零开始的Docker详解(六)

    Docker仓库 docker仓库是集中存放镜像的地方 类似maven的仓库集中存放依赖 Docker Hub Docker Hub是由Docker官方维护的公共仓库 包含官方镜像和个人上传的镜像 大部分镜像都可以在上面找到 注 非官方的镜
  • CentOS7.3 安装

    选择Install CentOS Linux 7 选择语言 点击软件选择 选择基本环境 点击安装位置 选择我要配置分区 点击完成 根据需要选择分区方案 点击 根据需要添加挂载点 添加完所有挂载点后点击完成 在弹出的页面中选择接受更改 点击开
  • java基础知识点

    java中有四大修饰符 分别为private default protected public 下面主要是四者之间的区别 private 私有的 private可以修饰成员变量 成员方法 构造方法 不能修饰类 此刻指的是外部类 内部类不加以
  • 【mybatis-plus】学习笔记

    官方地址 https mp baomidou com 自动化工具 JPA tk imapper MybatisPlus 简介 MyBatis Plus 简称 MP 是一个 MyBatis 的增强工具 在 MyBatis 的基础上只做增强不做
  • 将Android项目打包成Library

    最近在弄一个SDK 考虑把项目做成 Library 类库的形式 方便调用 顺便在此分享给大家 首先 先创建一个普通的android项目 这个项目可以起任何你想要的名称 想要的包名等 步骤如下 在Package Explorer中 鼠标右键项
  • .NET Word模板引擎--MiniWord,继MiniExcel后又一开源作品

    目录 Part1简介 Part2特点 Part3安装 Part4使用 文本生成 图片生成 列表生成 表格生成 Part5总结 Part1简介 MiniWord 是 NET Word模板引擎 由Word模板和数据 简单 快速生成文件 Part
  • 启动模式,BOOT0和BOOT1详解

    原文链接 http blog csdn net daunxx article details 40148945 在画STM32的电路图的时候 关于STM32的启动方式纠结了一下 现有的参考设计都是在STM32的启动选择引脚BOOT0和BOO
  • 通过Java构建树形结构

    通过Java构建树形结构所需要的数据 实体类Test 主键 private String id 父类ID private String parentId 子节点 private List
  • matplotlib - 确保 0 在 RdBu 颜色条中变为白色

    matplotlib 确保 0 在 RdBu 颜色条中变为白色 matplotlib 确保 0 在 RdBu 颜色条中变为白色 IT工具网 标签 matplotlib colormap 我使用以下代码段创建了一个热图 span style
  • 丢手帕问题

    package Task author 链表解决丢手帕问题 约瑟夫问题 public class CycLink public static void main String args CycLinkModel cycLink new Cy
  • Vue3.x 中 vue.config 配置 Webpack-dev-server的proxy 实现代理跨域

    前言 如果你有单独的后端开发服务器 API 并且希望在同域名下发送 API 请求 那么代理某些 URL 会很有用 解决开发环境的跨域问题 不用在去配置nginx和host 爽歪歪 在webpack config js中配置 下面简单介绍一下
  • MySQL锁系列(八)之 死锁

    能学到什么 什么是死锁 死锁有什么危害 典型的死锁案例剖析 如何避免死锁 一 什么是死锁 1 必须满足的条件 1 2 1 必须有两个或者两个以上的事务 2 不同事务之间都持有对方需要的锁资源 A事务需要B的资源 B事务需要A的资源 这就是典
  • Protobuf(二)proto3语法格式

    proto文件有两种语法标准 proto2和proto3 我们以proto3为例 其语法格式如下 message