Protobuf
创始人
2024-09-25 08:24:47
0

Protocol Buffers(简称 protobuf)是一种由 Google 开发的数据序列化协议。它是一种与语言无关、平台无关、可扩展的机制,用于序列化结构化数据。你可以将其看作一种更小、更快、更简单的 XML 或 JSON 替代方案。

一、下载及安装

1.源码下载地址

https://github.com/protocolbuffers/protobuf/releases

2.下载完成后输入如下命令进行解压

tar zxvf protobuf-all-21.12.tar.gz

3.再输入如下命令进入工作目录

cd protobuf-21.12/

4.再然后运行如下命令生成makefile文件

./configure

5.我在输入上述命令后出错了,原因是 no acceptable C compiler found in $PATH,于是经过查阅资料后输入下列命令,再重新输入4目录,成功

sudo apt-get install build-essential

6.在成功生成makefile文件后,先输入make进行构建,在输入如下命令进行安装

sudo make install

7.安装完成后查看版本信息时出现如下错误,需要依次输入如下命令即可

sudo find / -name libprotoc.so.32  sudo vim /etc/ld.so.conf #将搜索到的路径加入该文件 sudo ldconfig 

二、protobuf使用

在学习protbuf之前,我们需要搞清楚使用protbuf进行数据的序列化主要有哪几个步骤:确定数据格式,数据可简单可复杂,比如:
struct Person
{
    int id;
    string name;
    string sex;    
    int age;
};
1.创建一个新的文件, 文件名随意指定, 文件后缀为 .proto

2.根据protobuf的语法, 编辑.proto文件

3.使用 protoc 命令将 .proto 文件转化为相应的 C++ 文件

4.需要将生成的c++文件添加到项目中, 通过文件中提供的类 API 实现数据的序列化/反序列化

1.编写cmakelists.txt文件

a.创建一个CMakeLists.txt文件,在该文件中先输入如下代码

cmake_minimum_required(VERSION 3.24) #cmake所要求最低版本 project(Protoc_test)    #项目名称 set(CMAKE_CXX_STANDARD 17)#c++17

b.接下来搜索当前目录下所有的源文件

aux_source_directory(./ SRC)#./  指在当前目录搜索 存入SRC变量中

c.添加静态库和链接protobuf的动态库

add_library(test ${SRC}) target_link_libraries(test protobuf)

2.编写.proto文件

将下列.c文件,编写转换为.proto文件

struct Person {     int id;     int age;     string name;          };
syntax="proto3";  message Person{     int32 id=1;     int32 age=2;     bytes name=3;  }

执行如下命令,生成.pb.cc和.pb.h文件

protoc ./Person.proto --cpp_out=./

3.序列化

以下是四个序列化函数

bool SerializeToString(std::string* output) const;
bool SerializeToArray(void* data, int size) const;
bool SerializeToOstream(std::ostream* output) const;
bool SerializeToFileDescriptor(int file_descriptor) const;

 #include"Person.pb.h" void test(){     //序列化 Person p; p.set_id(10); p.set_age(20); p.set_name("zhu"); std::string s; //序列化对象p int Arr[1024]; p.SerializeToString(&s);//传出参数 s是二进制 //p.SerializeToArray(Arr,1024);第二种函数,将其存储至数组中 

4.反序列化

以下是反序列化函数
bool ParseFromString(const std::string& data) ;
bool ParseFromArray(const void* data, int size);
bool ParseFromIstream(std::istream* input);
bool ParseFromFileDescriptor(int file_descriptor);

//反序列化操作 Person pp; pp.ParseFromString(s);//对其进行反序列化操作,谁调用这个函数,解析出来的数据就存储 //至哪个对象 std::cout<

三、protobuf中数据格式的转换

 1.repeated

若数据成员中有数组,则给对应数据成员前加repeated;

2.enum

enum若进行指定,第一个值必须为零

3.在proto文件中加入proto文件

在生成时需要也对xxx.proto进行生成

import "xxx.proto";

4.包(命名空间)

package 空间名;

在其他文件中使用

包名.类型

相关内容

热门资讯

安卓系统可以分享视频吗,安卓系... 你有没有想过,手机里的视频怎么才能和朋友一起分享呢?尤其是当你发现了一个超级搞笑的短视频,或者是一部...
安卓系统上安装pc软件,跨平台... 你是不是也和我一样,对安卓系统上的那些PC软件垂涎欲滴呢?想象在手机上就能享受到电脑上的强大功能,是...
安卓原生系统怎么折腾,深度定制... 你有没有想过,你的安卓手机其实就像一个等待你发挥创意的画布呢?没错,就是那个安卓原生系统,它可是隐藏...
安卓作业系统耗电,深度解析耗电... 手机电量告急,是不是你也和我一样,对安卓作业系统的耗电问题头疼不已?别急,今天就来聊聊这个让人又爱又...
宝宝浙江游戏安卓系统,乐享童年 最近有没有发现你家的小宝贝对手机上的游戏越来越感兴趣了呢?尤其是那些在浙江地区特别受欢迎的安卓系统游...
安卓系统程序放在那,安卓系统程... 你有没有发现,手机里的安卓系统程序总是乱糟糟的,有时候找起来就像大海捞针一样?别急,今天就来给你揭秘...
手表怎么装上安卓系统,轻松安装... 你有没有想过,你的安卓手机那么智能,那你的手表呢?是不是也想给它来个升级,让它也能玩转各种应用,变身...
碧蓝航线在安卓系统,安卓平台上... 你知道吗?最近在安卓系统上,有一款游戏可是火得一塌糊涂,那就是《碧蓝航线》!这款游戏不仅画面精美,剧...
安卓系统设置分辨率,解锁屏幕显... 亲爱的手机控们,你是不是也和我一样,对手机屏幕的分辨率有着超乎寻常的执着呢?分辨率,这个看似简单的数...
安卓超市收银系统下载,高效便捷... 你有没有想过,逛超市的时候,收银员那熟练的操作是不是让你也跃跃欲试呢?现在,机会来了!安卓超市收银系...
安卓系统升级清理,深度清理与性... 亲爱的手机控们,你是不是也和我一样,对安卓系统的升级清理充满了好奇和期待呢?每次系统更新,都仿佛是给...
安卓如何绕过系统安装,深度解析... 你是不是也和我一样,对安卓系统的安装限制感到有些头疼?有时候,我们可能需要安装一些特殊的软件或者游戏...
安卓系统跟linux系统怎么样... 你有没有想过,你的手机里那个默默无闻的安卓系统,和电脑上那个稳如泰山的Linux系统,它们之间到底有...
凤凰系统用安卓软件很卡,凤凰系... 最近是不是发现你的凤凰系统用安卓软件时总是卡得要命?别急,让我来给你细细道来,看看这其中的原因和解决...
安卓系统怎么玩脸书,脸书应用攻... 你有没有想过,在安卓系统上怎么玩转脸书呢?这个全球最大的社交平台,可是让很多人沉迷其中哦!别急,今天...
虚拟机系统安卓11,虚拟机系统... 你有没有想过,手机里的安卓系统竟然也能变成电脑上的虚拟机?没错,就是那个我们每天不离手的安卓11系统...
钻石vip微信安卓系统,畅享无... 你知道吗?在微信这个庞大的社交世界里,钻石VIP可是个让人羡慕的身份呢!尤其是对于那些安卓系统的用户...
安装安卓系统后蓝屏,安卓系统安... 你刚刚升级了安卓系统,是不是觉得自己的手机焕然一新,充满了科技感?就在你沉浸在新系统的美好体验中时,...
安卓系统如何调出返回键,安卓系... 你是不是也和我一样,有时候在使用安卓手机时,突然发现那个神秘的返回键怎么就消失了?别急,今天就来手把...
荣耀8安装原生安卓系统,体验纯... 你有没有想过,让你的荣耀8手机焕发新生?别再让它被那些臃肿的第三方系统拖累啦!今天,就让我带你一起探...