news 2026/4/16 15:09:04

一.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/16 13:01:29

为什么内存条涨价

近期内存条价格大幅上涨&#xff0c;主要是由人工智能&#xff08;AI&#xff09;技术驱动下的需求激增与供应链端的主动调整共同导致的一个全球性现象。其影响正从产业链上游一直传导至普通消费者。&#x1f914; 内存涨价的核心原因内存涨价是供需两端多重因素叠加的结果&…

作者头像 李华
网站建设 2026/4/16 1:54:17

MsgViewer终极指南:轻松掌握邮件查看与格式转换技巧

MsgViewer终极指南&#xff1a;轻松掌握邮件查看与格式转换技巧 【免费下载链接】MsgViewer MsgViewer is email-viewer utility for .msg e-mail messages, implemented in pure Java. MsgViewer works on Windows/Linux/Mac Platforms. Also provides a java api to read mai…

作者头像 李华
网站建设 2026/4/16 12:57:26

DIY开源实战:如何用NANDO编程器解决嵌入式闪存调试难题

DIY开源实战&#xff1a;如何用NANDO编程器解决嵌入式闪存调试难题 【免费下载链接】nand_programmer NANDO - NAND Open programmer 项目地址: https://gitcode.com/gh_mirrors/na/nand_programmer 在嵌入式开发中&#xff0c;面对各种NAND闪存芯片的读写操作&#xff…

作者头像 李华
网站建设 2026/4/2 11:42:18

Equalizer APO终极指南:5步打造专业级音频体验

Equalizer APO终极指南&#xff1a;5步打造专业级音频体验 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo 想要让电脑音质脱胎换骨&#xff1f;Equalizer APO这款免费开源的音频增强工具绝对是你的不二…

作者头像 李华
网站建设 2026/4/16 14:48:34

网易云音乐个性化推荐优化神器:轻松掌握音乐算法主动权

你是否曾为网易云音乐的推荐不够精准而烦恼&#xff1f;想要让系统更懂你的音乐品味&#xff0c;却不知从何入手&#xff1f;这款免费开源的网易云音乐快速听歌工具&#xff0c;正是为你量身打造的解决方案。通过智能化操作&#xff0c;帮助用户主动训练推荐算法&#xff0c;让…

作者头像 李华