00. 目录

文章目录

  • 00. 目录
  • 01. ProtoBuf操作步骤
  • 02. 消息格式
  • 03. 数据类型
  • 04. 定义 proto 文件
  • 05. 参考

参考代码下载:02_demo.rar

01. ProtoBuf操作步骤

知道了 ProtoBuf 的作用与支持的数据类型。我们需要知道 ProtoBuf 使用的一般步骤,下面以 C++ 中使用 ProtoBuf 为例来描述使用的一般步骤。

第一步:定义 proto 文件,文件的内容就是定义我们需要存储或者传输的数据结构,也就是定义我们自己的数据存储或者传输的协议。

第二步:编译安装 ProtoBuf 编译器 protoc 来编译自定义的 proto 文件,用于生成 .pb.h 文件(proto 文件中自定义类的头文件)和 .pb.cc(proto文件中自定义类的实现文件)。

第三步:使用 ProtoBuf 的 C++ API 来读写消息。

ProtoBuf C++编程指南:https://developers.google.com/protocol-buffers/docs/cpptutorial

02. 消息格式

syntax = "proto3"; //指定版本信息,不指定会报错message Person  //message为关键字,作用为定义一种消息类型
{string name = 1;    //姓名int32 id = 2;       //idstring email = 3;   //邮件
}

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

格式:数据类型 字段名称 = 唯一的编号标签值;
  • 字段名称:protobuf建议以下划线命名而非驼峰式

  • 唯一的编号标签:代表每个字段的一个唯一的编号标签,在同一个消息里不可以重复。这些编号标签用与在消息二进制格式中标识你的字段,并且消息一旦定义就不能更改。需要说明的是标签在1到15范围的采用一个字节进行编码,所以通常将标签1到15用于频繁发生的消息字段。编号标签大小的范围是1到229。此外不能使用protobuf系统预留的编号标签(19000 ~19999)。

03. 数据类型

proto文件消息类型 C++ 类型 说明
double double 双精度浮点型(64位)
float float 单精度浮点型(32位)
int32 int32 使用可变长编码方式,负数时不够高效,应该使用sint32
int64 int64 使用可变长编码方式,负数时不够高效,应该使用sint64
uint32 uint32 32位无符号整数
uint64 uint64 64位无符号整数
sint32 sint32 使用可变长编码方式,有符号的整型值,负数编码时比通常的int32高效
sint64 sint64 使用可变长编码方式,有符号的整型值,负数编码时比通常的int64高效
fixed32 uint32 总是4个字节,如果数值总是比2^28大的话,这个类型会比uint32高效
fixed64 uint64 总是8个字节,如果数值总是比2^56大的话,这个类型会比uint64高效
sfixed32 int32 总是4个字节
sfixed64 int64 总是8个字节
bool bool 布尔类型
string string 一个字符串必须是utf-8编码或者7-bit的ascii编码的文本
bytes string 可能包含任意顺序的字节数据,处理多字节的语言字符、如中文
enum enum 枚举
message object of class 自定义的消息类型

更多类型请参考:https://developers.google.com/protocol-buffers/docs/encoding

04. 定义 proto 文件

定义 proto 文件就是定义自己的数据存储或者传输的协议格式。

deng@itcast:~/test01/02_demo$ ls
addressbook.proto
deng@itcast:~/test01/02_demo$ cat addressbook.proto
syntax = "proto3";
message Person {string name = 1;int32 id = 2;  // Unique ID number for this person.string email = 3;
}
deng@itcast:~/test01/02_demo$ protoc ./addressbook.proto --cpp_out=./
deng@itcast:~/test01/02_demo$ ls
addressbook.pb.cc  addressbook.pb.h  addressbook.proto
deng@itcast:~/test01/02_demo$

通过查看头文件,可以发现针对每个字段都会大致生成如下几种函数,以name为例:

  // string name = 1;void clear_name();const std::string& name() const;void set_name(const std::string& value);void set_name(std::string&& value);void set_name(const char* value);void set_name(const char* value, size_t size);std::string* mutable_name();std::string* release_name();void set_allocated_name(std::string* name);private:const std::string& _internal_name() const;void _internal_set_name(const std::string& value);std::string* _internal_mutable_name();

说明

可以看出,对于每个字段会生成一个clear清除函数(clear_name)、set函数(set_name)、get函数(name和mutable_name)。

解释下get函数中的两个函数的区别: 对于原型为const std::string &number() const的get函数而言,返回的是常量字段,不能对其值进行修改。但是在有一些情况下,对字段进行修改是必要的,所以提供了一个mutable版的get函数,通过获取字段变量的指针,从而达到改变其值的目的。

05. 参考

参考博客:https://www.cnblogs.com/royenhome/archive/2010/10/29/1864860.html

【Protocol Buffer】Protocol Buffer入门教程(二):消息类型相关推荐

  1. Android WebRTC 入门教程(二) -- 模拟p2p本地视频传输

    Android WebRTC 入门教程(一) – 使用相机 Android WebRTC 入门教程(二) – 模拟p2p本地视频传输 源码工程: https://github.com/LillteZh ...

  2. python elasticsearch 入门教程(二) ---全文搜索

    python elasticsearch 入门教程(二) ---全文搜索 截止目前的搜索相对都很简单:单个姓名,通过年龄过滤.现在尝试下稍微高级点儿的全文搜索--一项 传统数据库确实很难搞定的任务. ...

  3. R语言七天入门教程二:认识变量与运算符

    R语言七天入门教程二:认识变量与运算符 一.什么是变量 1.变量 顾名思义,我们可以将变量理解为"可以改变的量",是计算机语言中能储存计算结果或能表示值的抽象概念.这里的值可以是数 ...

  4. (转)tensorflow入门教程(二十六)人脸识别(上)

    https://blog.csdn.net/rookie_wei/article/details/81676177 1.概述 查看全文 http://www.taodudu.cc/news/show- ...

  5. LittleVGL (LVGL)干货入门教程二之LVGL的输入设备(indev)API对接。

    LittleVGL (LVGL)干货入门教程二之LVGL的输入设备(indev)API对接 前言: 阅读前,请确保你拥有以下条件: 你已经完成"显示API"的移植. 你已经实现了一 ...

  6. c语言类似于 n的标识符,C语言快速入门教程(二)

    C语言快速入门教程(二) C语言的基本语法 本节学习路线图: 引言: C语言,顾名思义就是一门语言,可以类比一下英语; 你要说出一个英语的句子需要: 单词 + 语法! 将单词按照一定的语法拼凑起来就成 ...

  7. 微信小程序云开发 初学者入门教程二

    微信小程序云开发 初学者入门教程二-前端操作数据库模块 如何操作数据库,作为一名前端,如果对数据的知识不够熟悉也没关系,从现在开始好好学习就行,数据库的操作内容差不多涉及增删改查四大模块,花一些业余的 ...

  8. ros2与Python入门教程-使用消息 - 创客智造

    **ros2与Python入门教程-使用消息 ** 说明: 介绍如何python来测试消息 步骤: 如何创建消息 ,参考ROS2与C++入门教程-创建消息(msg)文件 利用python来测试消息 使 ...

  9. python爬虫入门教程(二):开始一个简单的爬虫

    2019/10/28更新 使用Python3,而不再是Python2 转载请注明出处:https://blog.csdn.net/aaronjny/article/details/77945329 爬 ...

  10. quarkus 入门教程(二) -项目开发模式热更新及项目断点调试方法

    quarkus 入门教程(二) -项目断点调试方法 1.项目热更新 quarkus:dev runs 方式启动,项目会以开发者模式启动,当修改了java文件或者resource文件后,项目会在后台编译 ...

最新文章

  1. Jenkins:配置信息变更历史
  2. c语言中的字节序和字节对齐,C语言字节序对齐以及空间利用率
  3. IOS6学习笔记(四)
  4. 20190703 关于如何驱动
  5. java equals 区别_Java中equals和==的区别
  6. 浅谈CruiseControl的部署
  7. LeetCode160 | Intersection-of-two-linked-lists
  8. java面试之HashMap延伸出来的--什么是ConcurrentHashMap?
  9. 如何搭建MySQL数据库,常用的数据库命令
  10. JavaWeb(一)
  11. 匹配数据库 帆软 查询条件_帆软报表学习笔记①——根据参数查询
  12. 基于SpringBoot超市库存管理系统+文档
  13. c语言人机大战五子棋,五子棋人机大战将打响 祁观将与AI弈心五番棋对决
  14. flv格式转换为mp4(ffmpeg)
  15. excel表格打印每页都有表头_13个关于Excel表格的打印技巧
  16. Matlab之数据筛选
  17. 【IT情感】关于专业、理想和工作的认知
  18. 如何用PS制作一寸照片
  19. 2.12美团点评技术
  20. CSP认证202209-3:防疫大数据

热门文章

  1. 在控制台读取用户输入密码,你会么?
  2. resizable 回调函数参数详解
  3. C# 反射中的GetType
  4. 【Vegas原创】终端服务器超出了最大允许连接数 解决方法
  5. 华为手机充满有提醒吗_华为推出的联发科天玑手机华为nova8 SE,你会买吗?
  6. python的jsonpath_python 提取json数据的jsonPath介绍及简单使用
  7. vue前端服务器端口_解密智联招聘的大前端架构 Ada
  8. 三维点云可以导航吗_基于视觉高精定位的“室内AR导航”技术点解析
  9. Docker进阶-资源管理Swarm+Portainer
  10. Intellij Idea上传本地项目到Git