news 2026/4/23 7:56:54

一.ProtoBuf

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一.ProtoBuf

一.初识ProtoBuf

1.序列化概念

2.ProtoBuf是什么

3.ProtoBuf的使用特点

二.安装ProtoBuf

1.win下载链接:

https://github.com/protocolbuffers/protobuf/releases/tag/v21.11

2.Ubuntu下载

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

sudo yum install autoconf automake libtool curl make gcc-c++ unzip

Release Protocol Buffers v21.11 · protocolbuffers/protobuf · GitHub

将其下载到我们的服务器上面

将其进行解压(unzip)

3.安装

https://blog.csdn.net/AlexWang30/article/details/90341172

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/local/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/

4.检查是否安装成功

三.完整学习思路

四.快速上手

步骤1: 创建.proto 文件

// 首行 : 语法指定行 syntax = "proto3"; package contacts;//package -> namespace //定义联系人message message PeopleInfo { string name = 1; //姓名 int32 age = 2; //年龄 }

步骤2:编译该.proto文件

如果不是在当前目录下,我们要使用-I选项

还有很多的方法供我们进行使用

详细message API可以参见: https://developers.google.cn/protocol-buffers/docs/reference/cpp/google.protobuf.message.html#Message

步骤3:序列化和反序列化的使用

#include <iostream> #include "contacts.pb.h" int main() { std::string people_str; //对一个联系人的信息使用 PB 进行序列化,并将结果打印出来 contacts::PeopleInfo people1; people1.set_name("张三"); people1.set_age(18); if(!people1.SerializeToString(&people_str)) { std::cout << "序列化联系人失败!" << std::endl; return -1; } std::cout << "序列化成功, 结果: " << people_str << std::endl; //对序列化后的内容使用 PB 进行反序列化,解析联系人信息并打印 contacts::PeopleInfo people2; if(!people2.ParseFromString(people_str)) { std::cout << "反序列化联系人失败!" << std::endl; return -1; } std::cout << "反序列化成功, 结果: " << std::endl; std::cout << "Name: " << people2.name() << std::endl; std::cout << "Age: " << people2.age() << std::endl; return 0; }

进行编译

ProtoBuf小结

五.proto 3 语法详解

1.字段规则

2.消息类型的定义与使用

a.定义

b.使用

"phone.proto" syntax = "proto3"; package phone; message Phone { string number = 1; }
// 首行 : 语法指定行 syntax = "proto3"; package contacts2; import "phone.proto"; // message Phone // { // string number = 1; // } //定义联系人message message PeopleInfo { string name = 1; //姓名 int32 age = 2; //年龄 // message Phone // { // string number = 1; // } repeated phone.Phone phone = 3; }

3.通讯录2.0版本

repeat会被解析成C++中的vector

syntax = "proto3"; package contacts2; //定义联系人message message PeopleInfo { string name = 1; //姓名 int32 age = 2; //年龄 message Phone { string number = 1; } repeated Phone phone = 3; } message Contacts { repeated PeopleInfo contacts = 1; }

进行编译 ( protoc --cpp_out=. contacts.proto )

#include <iostream> #include <fstream> #include "contacts.pb.h" using namespace std; void AddPeopleInfo(contacts2::PeopleInfo* contact) { cout << "---------------新增联系人-------------" << endl; cout << "请输入姓名:" << endl; string name; getline(cin,name); contact->set_name(name); cout << "请输入联系人年龄" << endl; int age; cin >> age; contact->set_age(age); cin.ignore(256,'\n'); for(int i = 0;;i++) { cout << "请输入" << i+1 << "个联系人电话: " << endl; string phone; getline(cin,phone); if(phone.empty()) { break; } contacts2::PeopleInfo_Phone* phone_number = contact->add_phone(); phone_number->set_number(phone); } cout << "--------------新增联系人成功-------------" << endl; } int main() { contacts2::Contacts contacts; //读取以及存在的联系人文件 fstream input("contacts.bin",ios::in|ios::binary); if(!input.is_open()) { cout<<"open file failed, create new file!"<<endl; } else if(!contacts.ParseFromIstream(&input)) { cout<<"parse file failed!"<<endl; input.close(); return -1; } //向通讯录中添加联系人 AddPeopleInfo(contacts.add_contacts()); //将通讯录写入本地文件 fstream output("contacts.bin",ios::out|ios::binary|ios::trunc); if(!output.is_open()) { cout<<"open file failed!"<<endl; return -1; } else if(!contacts.SerializeToOstream(&output)) { cout<<"serialize file failed!"<<endl; output.close(); input.close(); return -1; } cout << "write success!" << endl; input.close(); output.close(); return 0; }

4.linux中查看二进制文件的工具

hexdump操作

5.通讯录2.0的读取实现

#include <iostream> #include <fstream> #include "contacts.pb.h" using namespace std; void PrintContacts(contacts2::Contacts& contacts) { for (int i = 0; i < contacts.contacts_size(); i++) { cout << "----------------联系人" << i+1 << "----------------" << endl; const contacts2::PeopleInfo& people = contacts.contacts(i); cout << "联系人姓名: " << people.name() << endl; cout << "联系人年龄: " << people.age() << endl; for (int j = 0; j < people.phone_size(); j++) { const contacts2::PeopleInfo_Phone& phone = people.phone(j); cout << " 联系人电话" << j+1 << ": " << phone.number() << endl; } } } int main() { contacts2::Contacts contacts; // 读取本地已存在的通讯录文件 fstream input("contacts.bin", ios::in | ios::binary); if (!contacts.ParseFromIstream(&input)) { cerr << "parse error!" << endl; input.close(); return -1; } // 打印通讯录列表 PrintContacts(contacts); return 0; }

6.--decode

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 0:59:03

让设施“看得见、测得准、管得住”——空间视频智能感知与透明化管控技术研究技术白皮书(正式发布版)

发布单位&#xff1a;镜像视界&#xff08;浙江&#xff09;科技有限公司本白皮书由镜像视界&#xff08;浙江&#xff09;科技有限公司基于其在空间视频智能感知、多源信息融合与透明化管控领域的持续技术研究与工程实践编制完成。白皮书围绕高安全关键设施在运行管理中面临的…

作者头像 李华
网站建设 2026/4/16 6:11:31

Habitat-Matterport 3D数据集完整部署指南

Habitat-Matterport 3D数据集完整部署指南 【免费下载链接】habitat-matterport3d-dataset This repository contains code to reproduce experimental results from our HM3D paper in NeurIPS 2021. 项目地址: https://gitcode.com/gh_mirrors/ha/habitat-matterport3d-dat…

作者头像 李华
网站建设 2026/4/19 10:55:18

41、有限域上的算法:多项式因式分解与相关问题

有限域上的算法:多项式因式分解与相关问题 1. 引言 在有限域的研究中,有几个关键问题备受关注,包括多项式因式分解、判断给定多项式是否不可约以及生成指定次数的不可约多项式。本文将详细探讨这些问题,并介绍相关的高效算法。 2. 有限域的基本设定 设 (F) 是一个特征为…

作者头像 李华
网站建设 2026/4/18 12:35:58

AMD Ryzen性能调优终极指南:RyzenAdj工具的完整使用教程

AMD Ryzen性能调优终极指南&#xff1a;RyzenAdj工具的完整使用教程 【免费下载链接】RyzenAdj Adjust power management settings for Ryzen APUs 项目地址: https://gitcode.com/gh_mirrors/ry/RyzenAdj 想要充分释放你的AMD Ryzen处理器潜力吗&#xff1f;RyzenAdj就…

作者头像 李华