1.6 预备知识——protobuf
在 Apollo Cyber RT 中使用到了 protobuf,鉴于部分同学之前并没有接触过,所以本节会介绍其简单使用,如果以前已经有所了解,本部分内容可以直接略过。
在前面我们安装完 Apollo Cyber RT 之后,运行了内置的发布订阅例程,发布方可以发布一组数据,订阅方可以接收到数据,那么数据是如何在二者之间传输的呢?在 Cyber RT 中就是使用 protobuf 实现的。
1.protobuf 简介
概念
protobuf 全称 Protocol buffers,是 Google 研发的一种跨语言、跨平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议。
特点
在序列化数据时常用的数据格式还有 XML、JSON等,相比较而言,protobuf 更小、效率更高且使用更为便捷,protobuf内置编译器,可以将protobuf 文件编译成 C++、Python、Java、C#、Go 等多种语言对应的代码,然后可以直接被对应语言使用,轻松实现对数据流的读或写操作而不需要再做特殊解析。
Protobuf 的优点如下:
- 高效 —— 序列化后字节占用空间比XML少3-10倍,序列化的时间效率比XML快20-100倍;
- 便捷 —— 可以将结构化数据封装为类,使用方便;
- 跨语言 —— 支持多种编程语言;
- 高兼容性 —— 当数据交互的双方使用同一数据协议,如果一方修改了数据结构,不影响另一方的使用。
Protobuf 也有缺点:
- 二进制格式易读性差;
- 缺乏自描述。
2.基本使用流程
在bazel中已经集成了protobuf的编译器,所以我们直接使用即可,接下来我们就通过一个案例来演示 protobuf 的基本使用,需求如下:
创建 protobuf 文件,在该文件中需要生命学生的姓名、年龄、身高、所有的书籍......等信息,然后分别使用C++和Python实现学生数据的读写操作。
该需求实现大致流程如下:
- 编写proto文件;
- 配置BUILD文件,编译生成对应的C++或Python文件;
- 在C++或Python中调用。
同一proto文件,是可以被多种语言使用的,所以在演示 C++ 和 Python 调用 proto 之前,我们可以编写proto文件并通过案例来学习一些proto的基本语法,后学习如何在C++ 和 Python 中调用 proto。