【Protocol Buffer】Protocol Buffer入门教程(二):消息类型
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入门教程(二):消息类型相关推荐
- Android WebRTC 入门教程(二) -- 模拟p2p本地视频传输
Android WebRTC 入门教程(一) – 使用相机 Android WebRTC 入门教程(二) – 模拟p2p本地视频传输 源码工程: https://github.com/LillteZh ...
- python elasticsearch 入门教程(二) ---全文搜索
python elasticsearch 入门教程(二) ---全文搜索 截止目前的搜索相对都很简单:单个姓名,通过年龄过滤.现在尝试下稍微高级点儿的全文搜索--一项 传统数据库确实很难搞定的任务. ...
- R语言七天入门教程二:认识变量与运算符
R语言七天入门教程二:认识变量与运算符 一.什么是变量 1.变量 顾名思义,我们可以将变量理解为"可以改变的量",是计算机语言中能储存计算结果或能表示值的抽象概念.这里的值可以是数 ...
- (转)tensorflow入门教程(二十六)人脸识别(上)
https://blog.csdn.net/rookie_wei/article/details/81676177 1.概述 查看全文 http://www.taodudu.cc/news/show- ...
- LittleVGL (LVGL)干货入门教程二之LVGL的输入设备(indev)API对接。
LittleVGL (LVGL)干货入门教程二之LVGL的输入设备(indev)API对接 前言: 阅读前,请确保你拥有以下条件: 你已经完成"显示API"的移植. 你已经实现了一 ...
- c语言类似于 n的标识符,C语言快速入门教程(二)
C语言快速入门教程(二) C语言的基本语法 本节学习路线图: 引言: C语言,顾名思义就是一门语言,可以类比一下英语; 你要说出一个英语的句子需要: 单词 + 语法! 将单词按照一定的语法拼凑起来就成 ...
- 微信小程序云开发 初学者入门教程二
微信小程序云开发 初学者入门教程二-前端操作数据库模块 如何操作数据库,作为一名前端,如果对数据的知识不够熟悉也没关系,从现在开始好好学习就行,数据库的操作内容差不多涉及增删改查四大模块,花一些业余的 ...
- ros2与Python入门教程-使用消息 - 创客智造
**ros2与Python入门教程-使用消息 ** 说明: 介绍如何python来测试消息 步骤: 如何创建消息 ,参考ROS2与C++入门教程-创建消息(msg)文件 利用python来测试消息 使 ...
- python爬虫入门教程(二):开始一个简单的爬虫
2019/10/28更新 使用Python3,而不再是Python2 转载请注明出处:https://blog.csdn.net/aaronjny/article/details/77945329 爬 ...
- quarkus 入门教程(二) -项目开发模式热更新及项目断点调试方法
quarkus 入门教程(二) -项目断点调试方法 1.项目热更新 quarkus:dev runs 方式启动,项目会以开发者模式启动,当修改了java文件或者resource文件后,项目会在后台编译 ...
最新文章
- Jenkins:配置信息变更历史
- c语言中的字节序和字节对齐,C语言字节序对齐以及空间利用率
- IOS6学习笔记(四)
- 20190703 关于如何驱动
- java equals 区别_Java中equals和==的区别
- 浅谈CruiseControl的部署
- LeetCode160 | Intersection-of-two-linked-lists
- java面试之HashMap延伸出来的--什么是ConcurrentHashMap?
- 如何搭建MySQL数据库,常用的数据库命令
- JavaWeb(一)
- 匹配数据库 帆软 查询条件_帆软报表学习笔记①——根据参数查询
- 基于SpringBoot超市库存管理系统+文档
- c语言人机大战五子棋,五子棋人机大战将打响 祁观将与AI弈心五番棋对决
- flv格式转换为mp4(ffmpeg)
- excel表格打印每页都有表头_13个关于Excel表格的打印技巧
- Matlab之数据筛选
- 【IT情感】关于专业、理想和工作的认知
- 如何用PS制作一寸照片
- 2.12美团点评技术
- CSP认证202209-3:防疫大数据
热门文章
- 在控制台读取用户输入密码,你会么?
- resizable 回调函数参数详解
- C# 反射中的GetType
- 【Vegas原创】终端服务器超出了最大允许连接数 解决方法
- 华为手机充满有提醒吗_华为推出的联发科天玑手机华为nova8 SE,你会买吗?
- python的jsonpath_python 提取json数据的jsonPath介绍及简单使用
- vue前端服务器端口_解密智联招聘的大前端架构 Ada
- 三维点云可以导航吗_基于视觉高精定位的“室内AR导航”技术点解析
- Docker进阶-资源管理Swarm+Portainer
- Intellij Idea上传本地项目到Git