【ProtoBuf 语法详解】选项 option

文章目录

  • [1. 选项 option](#1. 选项 option)
  • [2. 选项分类](#2. 选项分类)
  • [3. 常用选项列举](#3. 常用选项列举)
  • [4. 设置自定义选项](#4. 设置自定义选项)

1. 选项 option

.proto 文件中可以声明许多选项,使用 option 标注。选项能影响 proto 编译器的某些处理方式。

2. 选项分类

选项的完整列表在 google/protobuf/descriptor.proto 中定义。

选项分为 文件级消息级字段级 等等,但并没有一种选项能作用于所有的类型。

3. 常用选项列举

optimize_for :该选项为文件选项,可以设置 protoc 编译器的优化级别,分别为 SPEEDCODE_SIZELITE_RUNTIME。受该选项影响,设置不同的优化级别,编译 .proto 文件后生成的代码内容不同。

  • SPEED:protoc 编译器将生成的代码是高度优化的,代码运行效率高,但是由此生成的代码编译后会占用更多的空间。SPEED 是默认选项。
  • CODE_SIZE:proto 编译器将生成最少的类,会占用更少的空间,是依赖基于反射的代码来实现序列化、反序列化和各种其他操作。但和 SPEED 恰恰相反,它的代码运行效率较低。这种方式适合用在包含大量的 .proto 文件,但并不盲目追求速度的应用中。
  • LITE_RUNTIME:生成的代码执行效率高,同时生成代码编译后的所占用的空间也是非常少。这是以牺牲 Protocol Buffer 提供的反射功能为代价的,仅仅提供 encoding+序列化功能,所以我们在链接 BP 库时仅需链接 libprotobuf-lite,而非 libprotobuf。这种模式通常用于资源有限的平台,例如移动手机平台中。

示例代码如下:

proto 复制代码
option optimize_for = LITE_RUNTIME;

allow_alias:允许将相同的常量值分配给不同的枚举常量,用来定义别名。该选项为枚举选项。

举个例子:

proto 复制代码
enum PhoneType {
    option allow_alias = true;
    MP = 0;
    TEL = 1;
    LANDLINE = 1;  // 若不加 option allow_alias = true; 这一行会编译报错
}

4. 设置自定义选项

ProtoBuf 允许自定义选项并使用。该功能大部分场景用不到,在这里不拓展讲解。

有兴趣可以参考:Language Guide (proto 2)

相关推荐
leoZ23113 小时前
AI 辅助开发的五道坎
开发语言·人工智能·视觉检测·bert·php·超分辨率重建·openvino
会周易的程序员14 小时前
aiDgePLC — IEC61131-3 ST PLC 虚拟机调试与运行环境
c++·物联网·虚拟机·st·工业协议·iec61131·梯形图
程序员老陆14 小时前
Qt的QThread::usleep和FFmpeg的libavutil模块的av_usleep哪个精度高一些?
开发语言·qt·ffmpeg·音视频
2601_9638699514 小时前
【计算机毕业设计】基于Java的相框定制系统的设计与实现
java·开发语言·课程设计
名字还没想好☜15 小时前
Go 的 unsafe.Pointer 实战:零拷贝 []byte↔string 转换与三条铁律
开发语言·后端·golang·go·unsafe
wuminyu15 小时前
JVM利用io_uring优化堆外内存性能原理剖析
java·linux·c语言·jvm·c++
gumichef15 小时前
第二章:C/C++内存管理
c++·内存管理
天天进步201516 小时前
Python全栈项目--协同办公平台
开发语言·python
JAVA面经实录91716 小时前
集合框架 (六)
java·开发语言
xzlAwin16 小时前
Go语言多版本管理器g工具命令
开发语言·golang