ProtoBuf介绍与使用

news2024/9/28 9:22:59

文章目录

  • 1、ProtoBuf概述
  • 2、下载和安装
  • 3、简单使用

1、ProtoBuf概述

Protobuf(Protocol Buffers)是由Google开发的一种语言无关的数据序列化格式。它旨在将结构化数据(如结构化消息或文档)高效地序列化为紧凑的二进制表示,以便在网络上轻松传输或存储在磁盘上。
以下是Protocol Buffers的一些关键特性和概念:

  1. 语言无关:Protobuf不依赖于特定的编程语言,这意味着您可以使用一个简单的语言无关接口描述语言(IDL)定义数据结构,然后生成适用于各种编程语言的代码来处理这些结构。

  2. 数据结构定义:Protobuf使用结构化模式定义语言来定义要序列化的数据的结构。这个模式被编写在一个.proto文件中,它定义了数据结构的字段、类型和可选元数据。

  3. 紧凑的二进制格式:Protobuf将结构化数据序列化为二进制格式,这种格式比传统的基于文本的格式(如XML或JSON)更紧凑和高效。较小的大小减少了带宽和存储需求,使其非常适用于网络通信或存储大量数据。

  4. 高效的编码和解码:Protobuf使用高效的编码和解码机制,可以快速地对数据进行序列化和反序列化。二进制格式经过了优化,以提高速度,生成的代码提供了方便的API来处理序列化的数据。

  5. 版本控制和向后兼容性:Protobuf支持版本控制和向后兼容性。可以随着时间的推移演进数据模式,通过修改模式来适应新的需求,同时保持与旧版本数据的兼容性。

Protobuf具有许多其他功能和优点,例如可扩展性、跨平台支持和代码生成。它被广泛应用于各种领域,包括分布式系统、网络通信、数据存储和交换等。

2、下载和安装

下载ProtoBuf前一定要安装依赖库:autoconf automake libtool curl make g++ unzip
安装命令如下:
Ubuntu用户:

sudo apt-get autoconf automake libtool curl make g++ unzip -y

CentOS用户:

sudo yum install autoconf automake libtool curl make g++ unzip -y

ProtoBufe下载地址:https://github.com/protocolbuffers/protobuf/releases

在这里插入图片描述
我选择的版本是21.11

在这里插入图片描述

复制对应版本的链接,然后在Linux中下载,我选择的是protobuf-all-21.11.zip

wget https://github.com/protocolbuffers/protobuf/releases/download/v21.11/protobuf-all-21.11.zip

下载完成之后,进行解压

unzip protobuf-all-21.11.zip

解压完成之后,会在当前文件夹生成文件protobuf-21.11,它有以下内容

在这里插入图片描述

进入到protobuf-21.11文件后,执行以下命令:

#第一步执行autogen.sh,但如果下载的是具体某一门语言,则不需要执行这一步
./autogen.sh

#第二步执行configure,有两种执行方式,任选其一即可,如下:
#1.protobuf默认安装在 /usr/local 目录,lib、bin都是分散的
./configure

#2.修改安装目录,同一安装在 /usr/local/protobuf 下
./configure --prefix=/usr/local/protobuf
make	//执行15分钟
make check	//执行15分钟
sudo make install

到此,需要回忆一下在执行configure时,如果当时选择了第一种执行方式,也就是./configure,那么到这就可以正常使用protobuf。如果选择了第二种执行方式,即修改了安装目录,那么还需要/etc/profile中添加一些内容:

sudo vim /etc/profile

#添加内容如下:
#(动态库搜索路径)程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
#(静态库搜索路径)程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
#执行程序搜索路径
export PATH=$PATH:/usr/local/protobuf/bin/
#c程序头文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/ocal/protobuf/include/
#C++程序头件搜索路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
#pkg-config路径
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/

最后一步,重新执行/etc/profile文件:

source /etc/profile

查看确实安装成功
在这里插入图片描述

3、简单使用

首先来一段protobuf的定义语法:

//首行:语法指定行
syntax = "proto3";
package contacts;

//定义联系人message
message PeopleInfo 
{
    string name = 1;    //姓名
    int32 age = 2;      //年龄
}

syntax = “proto3”; 用于指定语法
package contacts; 相当于命名空间,防止多个message发生命名冲突
protobuf中定义一个数据结构需要用到关键字message,这点和c++中的class类似

protobuf中的标量数据类型与C++中的数据类型也是一一对应的

protobuf 数据类型描述打包C++语言映射
bool布尔类型1字节bool
double64位浮点数Ndouble
float32为浮点数Nfloat
int3232位整数Nint
uin32无符号32位整数Nunsigned int
int6464位整数N__int64
uint6464为无符号整Nunsigned __int64
sint32处理负数效率更高Nint32
sing6464位整数 处理负数效率更高N__int64
fixed3232位无符号整数4unsigned int32
fixed6464位无符号整数8unsigned __int64
sfixed3232位整数、能以更高的效率处理负数4unsigned int32
sfixed6464位整数8unsigned __int64
string只能处理 ASCII字符Nstd::string
bytes用于处理多字节的语言字符、如中文Nstd::string
enum可以包含一个用户自定义的枚举类型uint32N(uint32)enum
message可以包含一个用户自定义的消息类型Nobject of class

N 表示打包的字节并不是固定。而是根据数据的大小或者长度。
例如int32,如果数值比较小,在0~127时,使用一个字节打包。
关于枚举的打包方式和uint32相同。
关于 fixed32 和int32的区别。fixed32的打包效率比int32的效率高,但是使用的空间一般比int32多。因此一个属于时间效率高,一个属于空间效率高。根据项目的实际情况,一般选择fixed32,如果遇到对传输数据量要求比较苛刻的环境,可以选择int32.

在消息的定义中,每个字段等号后面都有唯一的标识号,用于在反序列化过程中识别各个字段的,一旦开始使用就不能改变。
字段唯一编号的范围:[1,229-1],其中19000~19999不可用,因为在protobuf协议中对这些字段进行了保留。
值得一提的是,范围为[1,15]的字段编号需要一个字节进行编码,[16,2047]内的数字需要两个字节进行编码。编码后的字节不仅只包含了编号,还包含了字段类型。所以1~15要用来标记出现非常频繁的字段,要为将来有可能添加的、频繁出现的字段预留一些出来。

编译前面的代码

protoc --cpp_out=. contacts.proto

protoc:编译命令
–cpp_out:表示生产的是c++代码
=号后面的点:表示生成的文件放在当前目录下
contacts.proto:表示编译的文件

在这里插入图片描述

在上级目录进行编译

protoc -I fast_start/ --cpp_out=fast_start/ contacts.proto

-I fast_start/:表示在 fast_start目录下查找对应的文件

对于编译生成的C++代码,包含了以下内容:

  • 对于每个message,都会生成一个对应的消息类
  • 在消息类中,编译器为每个字段提供了获取和设置方法,以及一下其他能够操作字段的方法
  • 编辑器会针对于每个.proto文件生成.h和.cc文件,分别用来存放类的声明与类的实现

注意:protobuf序列化的结果为二进制字节序列,而非文本格式

创建一个测试文件 main.cc,方法中我们实现

  • 对一个联系人的信息使用PB进行序列化,并将结果打印出来
  • 对序列化后的内容使用PB进行反序列化,解析出联系人信息并打印出来

main.cc

#include <iostream>
#include <string>
#include "contacts.pb.h"

int main()
{
    std::string people_str;
    {
        // 对一个联系人的信息使用PB进行序列化,并将结果打印出来
        contacts::PeopleInfo people;
        people.set_name("fl");
        people.set_age(22);
        if (!people.SerializeToString(&people_str))
        {
            std::cerr << "序列化联系人失败" << std::endl;
            return -1;
        }
        std::cout << "序列化成功,结果:" << people_str << std::endl;
    }

    {
        // 对序列化后的内容使用PB进行反序列化,解析出联系人信息并打印出来
        contacts::PeopleInfo people;
        if(!people.ParseFromString(people_str))
        {
            std::cerr << "反序列化联系人失败" << std::endl;
            return -1;
        }
        std::cout << "反序列化成功!" << people_str << std::endl
                  << "姓名: " << people.name() << std::endl
                  << "年龄: " << people.age() << std::endl;
    }
    return 0;
}

编译和运行:

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

在这里插入图片描述

由于ProtoBuf是把联系人对象序列化成了二进制序列,这里用string 来作为接收二进制序列的容器。所以在终端打印的时候会有换行等一些乱码显示。
所以相对于xml和JSON来说,因为被编码成二进制,破解成本增大,ProtoBuf编码是相对安全的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python GUI工具之PyQt5模块,pyCharm 配置PyQt5可视化窗口

https://doc.qt.io/qt-5/qtwidgets-module.html https://doc.qt.io/qt-5/qt.html#AlignmentFlag-enum 一、简介 PyQt是Qt框架的Python语言实现&#xff0c;由Riverbank Computing开发&#xff0c;是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合&#xff0c;每一…

【跑实验06】os包的理解?如何提取图片的名称?如何遍历一个文件夹,提取里面的图像名称?如何提取图片名称中的特定部分?代码错误地方修改;

文章目录 一、os包的理解1.1 文件和目录操作1.2 进程管理1.3 环境变量1.4 路径操作 二、如何提取图片的名称&#xff1f;三、遍历一个文件夹&#xff0c;提取里面的图像名称四、如何提取图片名称中的特定部分&#xff1f;五、代码报错修改 一、os包的理解 os 是 Python 中的一…

大厂OKR管理法:公开透明是最大特点

大厂OKR管理法&#xff1a;公开透明是最大的特点 仔细想&#xff0c;这是一件破天荒的事情 企业内部大部分的任务“公开透明” 公开透明会减少巨大的沟通成本 每个人的关键任务几乎是全部公开 估计少数的财务、人事、公关方面的不会 趣讲大白话&#xff1a;公开透明损耗少 【趣…

【UE 从零开始制作坦克】12-制作全自动机枪炮塔

效果 步骤 1. 下载模型和材质&#xff08;链接&#xff1a;https://download.csdn.net/download/ChaoChao66666/87951079&#xff09; 2. 将下载好的文件夹拖入UE工程中 首先点击“重置为默认”&#xff0c;然后勾选“合并网格体”&#xff0c;最后点击“导入所有” 导入后资源…

YOLOv5、YOLOv7独家原创改进:独家首发最新原创XIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能、收敛速度和鲁棒性

💡该教程为属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 💡本篇文章为YOLOv5、YOLOv7独家原创改进:独家首发最新原创XIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能、收敛速度和鲁棒性。 �…

【Java】Java数组链表类详记

本文仅供学习参考&#xff01; 相关文章地址&#xff1a; https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html https://www.w3schools.com/java/java_arraylist.asp https://www.runoob.com/java/java-arraylist.html Java ArrayList 基础知识 ArrayList是 …

SpringSecurity-尚硅谷

前置知识 掌握Spring框架掌握SpringBoot使用掌握JavaWEB技术 文章目录 前置知识1. 简介1.1 概要1.2 历史 2.入门案例2.1 创建一个项目2.1.1 pom.xml2.1.2 controller层 2.2 运行这个项目2.32.4 SpringSecurity 基本原理2.5 UserDetailsService 接口讲解2.6 PasswordEncoder 接…

AI黑客松近期比赛清单;36氪AI淘宝店盈利复盘;GitHub Copilot官方最佳实践;AI在HR领域的应用探索 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; ⋙ 点击查看 AI Hackathon (黑客马拉松) 汇总清单 &#x1f916; 〖飞桨〗2023大模型应用创新挑战赛 百度飞桨联合上海市青年五十人创新创业研究院等…

【软件测试】推荐几款适合练手的项目

最近收到许多自学自动化测试的小伙伴私信&#xff0c;学习了理论知识后&#xff0c;却没有合适的练手项目。 测试本身是一个技术岗位&#xff0c;如果只知道理论&#xff0c;没有实战经验&#xff0c;在面试中很难说服面试官&#xff0c;比如什么场景下需要添加显示等待&#x…

CentOs7 安装jdk8详细教程

方法一&#xff1a;gz安装包安装&#xff08;推荐&#xff09; 1.下载所需版本的.tar.gz安装包 Oracle官网即可下载&#xff0c;选择好对应版本&#xff0c;可以先下到主机&#xff0c;然后上传到虚拟机的Linux上。&#xff08;注意&#xff1a;Oracle现在下载jdk需要注册登录…

OAuth2.0与单点登录的区别

本文说下OAuth2.0与单点登录的区别 文章目录 概述什么是单点登录单点登录和Oauth2.0的区别单点登录的实现本文小结 概述 SSO是Single Sign On的缩写&#xff0c;OAuth是Open Authority的缩写&#xff0c;这两者都是使用令牌的方式来代替用户密码访问应用。流程上来说他们非常相…

解决联网时自动打开浏览器转到必应msn网址的问题

现象 开机后或者断网重连之后&#xff0c;系统自动打开默认浏览器&#xff08;不管是IE还是谷歌&#xff0c;或其他的浏览器&#xff09;网址为http://go.microsoft.com/fwlink/?LinkID219472&clcid0x409接着转到http://cn.bing.com/ 或者 https://www.msn.com/ 解决方法…

Kafka系列 - kafka 副本|AR|ISR|OSR|Leader|Follower|HW|LEO

文章目录 01. kafka 副本信息02. kafka 中 ISR、AR和OSR代表什么&#xff1f;03. kafka 中 ISR的伸缩指什么&#xff1f;04. 什么情况下一个broker会从ISR中踢出去&#xff1f;05. kafka 副本和ISR扮演什么角色&#xff1f;06. kafka 副本长时间不在ISR中&#xff0c;意味着什么…

buuctf re(二)+ web CheckIn

目录 re xor helloword reverse3 web SUCTF 2019 CheckIn xor 1.查壳 64位&#xff0c;无壳 2.ida&#xff0c;f5查看伪代码 3.跟进global dq是八个字节&#xff0c;汇编数据类型参考汇编语言---基本数据类型_汇编db类型_wwb0111的博客-CSDN博客 4.因为global变量里有一…

多商户商城有哪些功能和优势?-加速度jsudo

电商时代下&#xff0c;传统企业商家急需拓展业务规模&#xff0c;向线上拓展&#xff0c;而多商户小程序造价低&#xff0c;效应高&#xff0c;自然就成为了很多企业商家拓展线上营销渠道的首要选择,那么多商户小程序商城涵盖哪些功能呢?下面小编就来详细为大家解答&#xff…

UE5《Electric Dreams》项目PCG技术解析 之 理解Assembly(以SplineExample为例)

文章目录 1. 什么是Assembly2. PCG部分2.1 Assembly变换2.2 Point变换2.2.1. SG_CopyPointsWithHierachy2.2.2 过滤及点变换2.2.3. ApplyHierachy 3. 小结 1. 什么是Assembly UE5.2的PCG出了有一段时间了&#xff0c;大家玩得都很开心。很多朋友可能和老王一样&#xff0c;使用…

Rust语言从入门到入坑——(10)文件与IO

文章目录 0、引入1、命令行1.1 命令行参数1.2 命令行输入 2、文件操作2.1 读取文件2.2 写入文件 3、总结 0、引入 Rust 语言的 I/O 操作&#xff0c;最基本的交互模式&#xff0c;主流语言都具备的功能。 1、命令行 1.1 命令行参数 命令行程序是计算机程序最基础的存在形式&…

B050-cms05-轮播图 cookie session 登录

目录 轮播图修改操作删除操作查询并展示所有轮播图 无状态的HTTP协议CookieCookie的原理Cookie的创建获取Cookie更新Cookie设置cookie的声明周期设置cookie访问路径Cookie优缺点 SessionSession原理创建SessionSession的使用sesion的生命周期Session的优缺点Cookie和Session的区…

定积分计算—牛顿-莱布尼兹公式、定积分的几何意义、利用奇偶性化简、利用Wallis公式

定积分计算 前言定积分的常规计算技巧—牛顿-莱布尼茨公式定积分的几何意义利用奇偶性简化计算![在这里插入图片描述](https://img-blog.csdnimg.cn/9acfec48362141ba9486630f7060d78d.jpg)利用周期性平移和缩小积分区间利用Wallis公式利用一个常见的积分公式定积分计算练习题 …

yolov8 -01 部署

本想去配环境的步骤&#xff0c;在之前yolov5运行的环境下&#xff0c;试predict yolov8&#xff0c;竟然报错。 与其改bug, 选择重头来。 1. conda 创建新环境 yolo 8 conda create -n yolo82. 官网下载资料 官网下载yolo8相关资料 https://github.com/ultralytics/ultraly…