当前位置: 首页 > news >正文

一.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

http://www.jsqmd.com/news/89922/

相关文章:

  • QJ小结
  • 终极解决方案:Windows苹果设备驱动一键安装完整指南
  • 介绍一下内存条的各种参数
  • 技术分析算法工程化实践:从理论到高性能实现的架构演进
  • Zotero文献整理终极指南:7天打造整洁高效的文献库
  • 解锁B站新体验:5个PiliPlus隐藏功能让你告别官方客户端限制 [特殊字符]
  • 解锁B站新体验:5个PiliPlus隐藏功能让你告别官方客户端限制 [特殊字符]
  • 为什么内存条涨价
  • 一文讲解 USRP B210 / B200
  • OpenKM文档管理系统实战部署指南:从零搭建企业级文档管理平台
  • 一文讲解 USRP X310
  • 《程序员修炼之道-从小工到专家》阅读笔记其二
  • TouchGAL社区搭建全攻略:打造专属Galgame文化空间
  • 【声学】房间声学进行二维FDTD模拟(模拟声音传播、吸收和反射)【含Matlab源码 14695期】
  • 3个实战案例揭秘:如何用vue-pdf-embed打造专业级文档预览系统
  • 【组合导航】基于matlab GPS-INS组合导航仿真【含Matlab源码 14704期】
  • 25、寻找生成元和离散对数:算法与应用
  • Steam成就管理终极指南:SAM工具深度整合与高阶玩法全解析
  • 打造你的专属音乐云:DSub Android客户端终极指南
  • 3分钟搞定Windows苹果设备驱动安装:告别连接烦恼的终极指南
  • 终极指南:3步掌握LXMusic音源升级核心技巧
  • 如何快速掌握yt-dlp-gui:视频下载效率提升的终极指南
  • Formily组件集成实战:三步搞定第三方UI库适配
  • 2025年夸克网盘不限制速下载,下载速度达70MB
  • 1-Year Update Service for AUTEL ULTRA EV: Ensure Peak Performance for European American EV Owners
  • DSub终极指南:免费打造私人音乐云的完整教程
  • Habitat-Matterport 3D数据集完整部署指南
  • 关于如何编写onenet可视化平台数据过滤器让经纬度成功绑定到地图上的方法:显示最新地点以及显示历史轨迹版本
  • day 29
  • ArkLights终极指南:明日方舟全自动游戏助手的完整使用教程