Protobuf 文件语法

news/2024/12/25 12:47:24/文章来源:https://www.cnblogs.com/niumachen/p/18630131

Protobuf 文件的具体语法


1. 基本语法

1.1 语法版本

使用 syntax 指定 Protobuf 的版本(proto2proto3),目前推荐使用 proto3

syntax = "proto3";

1.2 包声明

使用 package 定义命名空间,避免不同模块间的命名冲突。

package mypackage;

1.3 导入其他文件

可以通过 import 导入其他 .proto 文件中的定义。

import "common.proto";

2. 数据类型

2.1 标量类型

Protobuf 支持多种标量类型:

数据类型 说明 示例
int32 / int64 整数,32位或64位 int32 age = 1;
uint32 / uint64 无符号整数,32位或64位 uint32 id = 2;
float 单精度浮点数 float score = 3;
double 双精度浮点数 double ratio = 4;
bool 布尔值 bool is_active = 5;
string 字符串 string name = 6;
bytes 二进制数据 bytes data = 7;

2.2 复合类型

  • 枚举类型:用于定义一组命名常量。
  • 消息类型:类似于结构体,用于定义复杂的数据结构。

3. 消息定义

3.1 基本结构

消息是 Protobuf 的核心,用于定义数据结构。

message User {int32 id = 1;       // 用户IDstring name = 2;    // 用户名bool is_active = 3; // 是否活跃
}

3.2 可选字段

proto3 中,所有字段默认是可选的,无需显式标记。

3.3 嵌套消息

消息可以包含其他消息作为字段。

message Address {string street = 1;string city = 2;
}message User {int32 id = 1;string name = 2;Address address = 3; // 嵌套消息
}

3.4 枚举类型

用于定义一组枚举值。

enum UserType {UNKNOWN = 0;ADMIN = 1;USER = 2;
}message User {int32 id = 1;string name = 2;UserType type = 3;  // 使用枚举类型
}

3.5 重复字段

使用 repeated 定义列表字段。

message User {int32 id = 1;repeated string roles = 2; // 角色列表
}

4. 服务定义

4.1 服务结构

用于定义 RPC 服务的接口。

service UserService {rpc GetUser (UserRequest) returns (UserResponse);rpc ListUsers (Empty) returns (stream User);
}

4. 字段编号

每个字段需要分配一个唯一的编号,用于二进制编码时的标识。

message User {int32 id = 1;       // 字段编号从1开始string name = 2;    // 每个字段编号必须唯一
}
  • 字段编号的范围为 1 ~ 2^29 - 1。
  • 编号范围:
    • 1~15:适合频繁出现的小字段(编码紧凑)。
    • 16~2^29 - 1:一般字段。


---### **5. 注释**- 使用 `//` 添加单行注释。
- 使用 `/* */` 添加多行注释。```proto
message User {int32 id = 1; // 用户ID/* 用户名 */string name = 2;
}

8. Protobuf 文件示例

完整示例:

syntax = "proto3";package example;import "google/protobuf/empty.proto";enum UserType {UNKNOWN = 0;ADMIN = 1;USER = 2;
}message User {int32 id = 1;string name = 2;UserType type = 3;repeated string roles = 4; // 用户角色
}message UserRequest {int32 id = 1;
}message UserResponse {User user = 1;
}service UserService {rpc GetUser (UserRequest) returns (UserResponse);rpc ListUsers (google.protobuf.Empty) returns (stream User);
}

总结

  • Protobuf 文件.proto 为扩展名,定义了数据结构和 RPC 服务接口。
  • 通过 protoc 工具,可以根据 .proto 文件生成多种语言的代码。
  • 语法简单,支持多种类型和扩展性,适合分布式系统和微服务开发场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/858604.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据误删?别怕!COS防误删攻略请查收

在云存储领域,数据的安全性始终是悬在头顶的达摩克利斯之剑。长期以来,腾讯云对象存储服务(COS)一直致力于数据安全的探索和实践,以保障数据的安全性和完整性。对象存储COS准备了一份防误删攻略给大家: 背景与意义在云存储领域,数据的安全性始终是悬在头顶的达摩克利斯之…

【日记】拼好了衣架!(524 字)

正文今早不小心把闹钟给关了,继 7:50 闹钟响了之后,下一次睁眼就是 8:28 了。吓得一哆嗦,穿衣服换鞋的速度起飞。到一楼,正好 8:30。还好行长没来(小声。昨天晚上,朝哥给我说他伤好得差不多了,可以开始考虑上课了。我一直在等他说出这句话。暑假班他受伤,完事儿之后我受…

【原创】解决ncnn yolov11 乱框,输出维度出错,无框问题

Abstract 解决:ncnn yolov11 乱框,输出维度出错,无框问题 Solution: ncnn yolov11 has random boxes, incorrect output dimensions, and no boxes 0x00: model export 首先是模型转换问题 最开始,我是用python的ultralytics导出为onnx格式文件(.onnx),这个文件在python的…

polarctf-crypto中等难度wp整理(截止至2024.12)

二进制一个音频文件,听了,不是摩斯电码看了wp,原来是拨号 考察:DTMF拨号音识别 使用dtmf2num这个工具解析这个音频二进制1和0 但是不是,它是01字符变形成摩斯密码,把0替换成.,把1替换成-,把*替换成空格。 得到一组摩斯电码,然后去解即可还要小写md5加密,服了这个老六…

杭州数据恢复之某公司经理的三星移动硬盘摔坏了盘片划伤二次开盘

这是一块老款三星Samsung使用mini USB接口的500G移动硬盘,采用了一体式电路板,型号是HM502JX。硬盘是用户不小心摔坏了,接电脑不识别而且有异响,先送修到百脑汇电脑城某家数据恢复中心进行开盘修复,但被告知盘片有划伤无法恢复数据。很巧用户公司里的一名员工曾经在我们这…

第十七次作业

1、安装最新版phpstudy集成工具并创建一个网站,编写php代码输出网站信息(phpinfo)2、安装vscode,并安装php开发插件、汉化插件、xdebug等插件 中⽂语⾔包安装php调试插件配置Open PHP/HTML/JS In Browser插件3、配置phpstudy集成工具xdebug扩展,并使用vscode对php代码进行…

dataezse接入zabbix监控

常用查询 目录常用查询zabbix 常用库表说明主机资源监控主机资源监控(纯值)oracle状态监控CPU top10DISK TOP 10Memory TOP 10SPACE USERD TOP 10问题告警级别分布问题列表null问题主机组正常主机总数主机问题排行 zabbix 常用库表说明 https://www.cnblogs.com/yaoyaojcy/p/…

MySQL 千万 级数据量根据(索引)优化 查询 速度

MySQL 千万 级数据量根据(索引)优化 查询 速度| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| -----…

kafka中文教程

kafka中文教程| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| -------------| -------------| -------…

银河麒麟桌面操作系统 使用root登录桌面端

麒麟 V10 桌面操作系统使用 root 登录 - 乔京飞 - 博客园 一、允许使用 root 用户登录 麒麟 V10 桌面操作系统安装过程后(或者安装完成后),必须创建一个新用户才能使用。很多目录中的文件,只能看不能改,甚至连创建一个新文件都不行。在终端执行命令,需要频繁的使用 sudo …

oracle exp 无法导出空表

oracle exp 无法导出空表| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| -------------| ------------…