《protobuf》入门

protobuf

  • 初始protobuf
  • 简单上手
    • 编写protobuf
    • 编译 .proto 文件
    • 编写测试文件 testPB.cc

初始protobuf

Protocol Buffers 是 Google 的一种语言无关、平台无关、可扩展的序列化结构数据的 方法,它可用于(数据) 通信协议、数据存储等。

Protocol Buffers 类比于 XML,是一种灵活,高效,自动化机制的结构数据序列化 方法,但是比 XML 更小、更快、更为简单。

你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序

ProtoBuf(全称为 Protocol Buffer )是让结构数据序列化的方法,其具有以下 特点:

语言无关、平台无关:即 ProtoBuf支持Java、C++、Python多种语言,支持多个平台 。
高效:即比XML更小、更快、更为简单。
扩展性 、兼容性好:你可以更新数据结构,而不影响和破坏原有的旧程序

❓什么是序列化

在这里插入图片描述

简单上手

编写protobuf

  • 编写.proto文件
// 规定使用proto3语法标准,一定得在首行
syntax="proto3";
// 类似C++中的namespace,package是⼀个可选的声明符,能表示.proto⽂件的命名空间,在项⽬中要有唯⼀性。它的作⽤是为了避免我们定义的消息出现冲突
package=contacts;// 消息类型命名规范:使⽤驼峰命名法,首字母大写
// message 消息体名称{}
message PeopleInfo
{string name = 1;int32 age = 2;
}

在 message 中,我们可以定义其属性字段,字段定义格式为: 字段类型 字段名 = 字段唯⼀编号

  • 字段名称命名规范:全小写字母,多个字母之间用 _ 连接。

  • 字段类型分为:标量数据类型特殊类型(包括枚举、其他消息类型等)。

  • 字段唯⼀编号:用来标识字段,一旦开始使用就不能够再改变。

字段唯⼀编号的范围
1 ~ 536,870,911(229-1),其中19000 ~ 19999不可用,做完保留字段

以下表格展示了标量数据类型,以及编译 .proto 文件之后自动生成的类中与之对应的字段类型。这里展示与C++语言对应的类型

TypeNotesC++ Type
doubledouble
floatfloat
int32使用变长编码[1]。负数的编码效率较低–若字段可能为负值,应使用 sint32 代替。int32
int64使用变长编码[1]。负数的编码效率较低–若字段可能为负值,应使用 sint64 代替。int64
uint32使用变长编码1uint32
uint64使用变长编码1uint64
sint32使用变长编码1。符号整型。负值的编码效率高于常规的 int32 类型。int32
sint64使用变长编码1。符号整型。负值的编码效率高于常规的 int64 类型。int64
fixed32定长 4 字节。若值常大于228则会比 uint32 更高效。uint32
fixed64定长 8 字节。若值常大于256 则会比 uint64 更高效。uint64
sfixed32定长 4 字节。int32
sfixed64定长 8 字节。int64
boolbool
string包含 UTF-8 和 ASCII 编码的字符串,长度不能超过 232string
bytes可包含任意的字节序列,长度不能超过 232string

编译 .proto 文件

在编写完 .proto 文件后,我们接着在终端对其进行编译

// 这里的.proto文件名称为 contacts
protoc --cpp_out=. contacts.proto

解释说明

protoc [--proto_path=IMPORT_PATH] --cpp_out=DST_DIR path/to/file.proto

在这里插入图片描述

cpp_out用来生成 C++ 代码,java_out产生 Java 代码,python_out产生 python 代码,类似地还有csharp_outobjc_outruby_outphp_out等参数。

在这里插入图片描述
成功编译如下
在这里插入图片描述

编写测试文件 testPB.cc

#include<iostream>
#include"contacts.pb.h"int main()
{std::string people_str;{contacts::PeopleInfo people;people.setname("张三");people.setage("22");// 序列化后的内容是二进制,people_str只是载体,用于后面反序列化if(!people.SerializeToString(&people_str))  {std::cout<< "序列化失败!" << std::endl;return -1;}std::cout<< "序列化成功! 结果为:" << people_str << std::endl;}{contacts::PeopleInfo people;// 将people_str内容反序列化成原来的内容if(!people.ParseFromString(people_str)){std::cout<< "反序列化失败!" << std::endl;return -1;}std::cout<< "反序列化成功!" << std::endl;std::cout << people.name() << std::endl;std::cout << people.age() << std::endl;}return 0;
}
  • 编译,链接容易出现的坑
  1. 漏掉 -lprotobuf
  2. 漏掉 contacts.pb.cc

正确写法

g++ -o testPB testPB.cc contacts.pb.cc -lprotobuf -std=c++11

在这里插入图片描述


  1. 变长编码:经过protobuf 编码后,原本4字节或8字节的数可能会被变为其他字节数 ↩︎ ↩︎ ↩︎ ↩︎

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

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

相关文章

【autodesk】浏览器中渲染rvt模型

使用Forge完成渲染 Forge是什么 为什么能够渲染出来rvt模型 Forge是由Autodesk开发的一套云端开发平台和工具集。在Forge平台中&#xff0c;有一个名为"Model Derivative"的服务&#xff0c;它可以将包括RVT&#xff08;Revit&#xff09;在内的多种BIM&#xff08…

【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码

【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码 1 题目 题目 D 题 圈养湖羊的空间利用率 规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养&#xff0c;适应不同种类、不同阶段的牲畜对空间的不同要求&#xff0c;以保障牲畜安全和健康&a…

lambda表达式介绍

前言 lambda表达式是C11标准才支持的&#xff0c;有了它以后在一些地方进行使用会方便很多&#xff0c;尤其在一些需要仿函数的地方&#xff0c;lambda表达式完全可以替代它的功能。代码的可读性也会提高。 目录 1.lambda表达式 2.lambda表达式语法 3.函数对象和lambda表达…

【MySQL】MySQL的安装,登录,配置和相关命令

文章目录 前言一. 卸载不需要的环境二. 获取MySQL的yum源三. 安装MySQL和启动四. 尝试登录MySQL方法1&#xff1a;获取临时root密码方法2&#xff1a;没有密码方法3&#xff1a;配置文件 五. 简单配置结束语 前言 本篇文章是基于云服务器&#xff1b;Linux&#xff1a;Centos7…

在 Windows 上远程对 Linux 进行抓包

文章目录 名词解释事先准备下载安装 Wireshark下载运行 libpcap设置 libpcap 环境变量在 Wireshark 中远程连接 libpcap 笔者的运行环境&#xff1a;&#xff08;成功&#xff09; 本地客户端&#xff1a; Windows&#xff1a; Windows 10 教育版&#xff08;本文&#xff09; …

【文末送书】全栈开发流程——后端连接数据源(二)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

【python手写算法】逻辑回归实现分类(含公式推导)

公式推导&#xff1a; 代码实现&#xff1a; # codingutf-8 import matplotlib.pyplot as plt import numpy as npdef f(w1,x1,w2,x2,b):zw1*x1w2*x2breturn 1/(1np.exp(-z)) if __name__ __main__:X1 [12.46, 0.25, 5.22, 11.3, 6.81, 4.59, 0.66, 14.53, 15.49, 14.43,2.1…

swiper删除虚拟slide问题

在存在缓存的情况下&#xff0c;删除较前的slide&#xff0c;会出现当前slide与后一个slide重复出现的情况 假设当前存在5个slide&#xff0c;且这5个slide已缓存&#xff0c;则删除slide2后&#xff0c;仍为5个slide&#xff0c;且slide2的内容变为slide3的内容&#xff0c;此…

JAVA设计模式第十讲:SPI - 业务差异解决方案

JAVA设计模式第十讲&#xff1a;SPI - 业务差异解决方案 我们需要在不修改源代码的情况下&#xff0c;动态为程序提供一系列额外的特性。首先想到的是Spring的AOP技术来构建应用插件&#xff0c;但是在Java自带的插件中&#xff0c;就有完整的实现。SPI&#xff08;Service Pro…

23062C++QT day2

封装一个结构体&#xff0c;结构体中包含一个私有数组&#xff0c;用来存放学生的成绩&#xff0c;包含一个私有变量&#xff0c;用来记录学生个数&#xff0c; 提供一个公有成员函数&#xff0c;void setNum(int num)用于设置学生个数 提供一个公有成员函数&#xff1a;void…

Vue3实战06-CompositionAPI+<script setup>好在哪?

Vue 3 的Composition API <script setup>这种最新的代码组织方式。

天翼云不做备案接入,如何绑定域名,不用80端口,443端口。

443&#xff0c;80端口不开启。 第一步&#xff1a; 宝塔更改web端口 搞个复杂的端口。 第二步&#xff1a; 在天翼云策略组上面开启修改过的web端口。 第三步&#xff1a;接入cdn&#xff0c;端口改成修改过的端口。

关于MyBatisPlus框架下出现xml里面定义的方法无法被正确识别以及提示调用mysql存储过程时参数无效的问题

第一个问题&#xff1a;xml里面明明定义了方法A&#xff0c;但是通过IService接口调用A的时候&#xff0c;总提示无法将接口中定义的函数绑定到xml中的同名方法中&#xff08;“Invalid bound statement (not found): com.aircas.sqlservice.mapper.SysTempIndexMapper.getRemo…

3D封装技术发展

长期以来&#xff0c;芯片制程微缩技术一直驱动着摩尔定律的延续。从1987年的1um制程到2015年的14nm制程&#xff0c;芯片制程迭代速度一直遵循摩尔定律的规律&#xff0c;即芯片上可以容纳的晶体管数目在大约每经过18个月到24个月便会增加一倍。但2015年以后&#xff0c;芯片制…

H.264视频编码推荐的分辨率和码率配置表

Video Encoding Settings for H.264 Excellence 针对H.264编码格式&#xff0c;根据不同分辨率&#xff0c;推荐其对应的码率配置关系如下图所示&#xff1a; 如下为上限&#xff0c;超过这个上限再增加码率基本无太大意义&#xff01;根据业务场景、帧率&#xff0c;建议码率…

Redis 7 第八讲 集群模式(cluster)架构篇

集群架构 Redis 集群架构图 集群定义 Redis 集群是一个提供在多个Redis节点间共享数据的程序集;Redis集群可以支持多个master 应用场景 Redis集群支持多个master,每个master又可以挂载多个slave读写分离支持数据的高可用支持海量数据的读写存储操作集群自带Sentinel的故障…

CSS水平垂直居中方案

1 前言 水平居中、垂直居中是前端面试百问不厌的问题。 其实现方案也是多种多样&#xff0c;常叫人头昏眼花。 水平方向可以认为是内联方向&#xff0c;垂直方向认为是块级方向。 下面介绍一些常见的方法。 <div class"container"><span class"inne…

Java反序列化之CommonsCollections CC1链分析

前言 cc链的研究可以说是非常适合java代码审计的入门篇了&#xff0c;十分考验java代码功力&#xff0c;其实也是基础功&#xff0c;跨过了这个门槛&#xff0c;在看看其他业务代码就会比较轻松了。不要说代码难&#xff0c;看不懂&#xff0c;作者也是刚入门java没几个月的小…

Python UI自动化 —— 关键字+excel表格数据驱动

步骤&#xff1a; 1. 对selenium进行二次封装&#xff0c;创建关键字的库 2. 准备一个表格文件来写入所有测试用例步骤 3. 对表格内容进行读取&#xff0c;使用映射关系来对用例进行调用执行 4. 执行用例 1. 对selenium进行二次封装&#xff0c;创建关键字的库 from time imp…

Cortex-A7 架构

参考《 Cortex-A7 Technical ReferenceManua.pdf 》和《 ARM Cortex-A(armV7) 编程手 册 V4.0.pdf 》 【 正点原子】I.MX6U嵌入式Linux驱动开发指南V1.6学习 1.Cortex-A7 MPCore 简介 I.MX6UL 使用的是 Cortex-A7 架构&#xff0c;Cortex-A7 MPcore 处理器支持 1~4 核&#…