00. 目录

文章目录

  • 00. 目录
  • 01. 枚举消息格式
  • 02. 枚举测试代码
  • 03. 编译和测试
  • 04. 包的消息格式
  • 05. 包的测试程序
  • 06. 编译和测试
  • 07. 附录

01. 枚举消息格式

当需要定义一个消息类型的时候,可能想为一个字段指定某“预定义值序列”中的一个值,这时候可以通过枚举实现。

syntax = "proto3";//指定版本信息,不指定会报错message Person //message为关键字,作用为定义一种消息类型
{string name = 1;    //姓名int32 id = 2;       //idstring email = 3; //邮件enum PhoneType //枚举消息类型{MOBILE = 0; //proto3版本中,首成员必须为0,成员不应有相同的值HOME = 1;WORK = 2;}message PhoneNumber{string number = 1;PhoneType type = 2;}repeated PhoneNumber phones = 4; //phones为数组
}message AddressBook
{repeated Person people = 1;
}

生成对应文件

deng@itcast:/mnt/hgfs/LinuxHome/day03$ protoc addressbook.proto --cpp_out=./
deng@itcast:/mnt/hgfs/LinuxHome/day03$

02. 枚举测试代码

#include "addressbook.pb.h"
#include <iostream>
#include <fstream>using namespace std;void set_addressbook()
{AddressBook obj;Person *p1 = obj.add_people(); //新增加一个Personp1->set_name("tom");p1->set_id(1);p1->set_email("tom@qq.com");Person::PhoneNumber *phone1 = p1->add_phones(); //增加一个phonephone1->set_number("110");phone1->set_type(Person::MOBILE);Person::PhoneNumber *phone2 = p1->add_phones(); //增加一个phonephone2->set_number("120");phone2->set_type(Person::HOME);fstream output("pb.itcast", ios::out | ios::trunc | ios::binary);bool flag = obj.SerializeToOstream(&output);//序列化if (!flag){cerr << "Failed to write file." << endl;return;}output.close();//关闭文件
}void get_addressbook()
{AddressBook obj;fstream input("./pb.itcast", ios::in | ios::binary);obj.ParseFromIstream(&input);  //反序列化input.close(); //关闭文件for (int i = 0; i < obj.people_size(); i++){const Person& person = obj.people(i);//取第i个peoplecout << "第" << i + 1 << "个信息\n";cout << "name = " << person.name() << endl;cout << "id = " << person.id() << endl;cout << "email = " << person.email() << endl;for (int j = 0; j < person.phones_size(); j++){const Person::PhoneNumber& phone_number = person.phones(j);switch (phone_number.type()){case Person::MOBILE:cout << "  Mobile phone #: ";break;case Person::HOME:cout << "  Home phone #: ";break;case Person::WORK:cout << "  Work phone #: ";break;}cout << phone_number.number() << endl;}cout << endl;}
}int main()
{// Verify that the version of the library that we linked against is// compatible with the version of the headers we compiled against.GOOGLE_PROTOBUF_VERIFY_VERSION;set_addressbook(); //序列化get_addressbook(); //反序列化// Optional:  Delete all global objects allocated by libprotobuf.google::protobuf::ShutdownProtobufLibrary();return 0;
}

03. 编译和测试

编译和测试结果

deng@itcast:/mnt/hgfs/LinuxHome/day03$ g++  test.cpp addressbook.pb.cc `pkg-config --libs --cflags protobuf`
deng@itcast:/mnt/hgfs/LinuxHome/day03$ ./a.out
第1个信息
name = tom
id = 1
email = tom@qq.comMobile phone #: 110Home phone #: 120deng@itcast:/mnt/hgfs/LinuxHome/day03$

04. 包的消息格式

.proto文件新增一个可选的package声明符,用来防止不同的消息类型有命名冲突。包的声明符会根据使用语言的不同影响生成的代码。对于C++,产生的类会被包装在C++的命名空间中。

syntax = "proto3";//指定版本信息,不指定会报错package tutorial; //package声明符message Person //message为关键字,作用为定义一种消息类型
{string name = 1;    //姓名int32 id = 2;       //idstring email = 3; //邮件enum PhoneType //枚举消息类型{MOBILE = 0; //proto3版本中,首成员必须为0,成员不应有相同的值HOME = 1;WORK = 2;}message PhoneNumber{string number = 1;PhoneType type = 2;}repeated PhoneNumber phones = 4; //phones为数组
}message AddressBook
{repeated Person people = 1;
}

05. 包的测试程序

#include "addressbook.pb.h"
#include <iostream>
#include <fstream>using namespace std;void set_addressbook()
{tutorial::AddressBook obj;tutorial::Person *p1 = obj.add_people(); //新增加一个Personp1->set_name("tom");p1->set_id(1);p1->set_email("tom@qq.com");tutorial::Person::PhoneNumber *phone1 = p1->add_phones(); //增加一个phonephone1->set_number("110");phone1->set_type(tutorial::Person::MOBILE);tutorial::Person::PhoneNumber *phone2 = p1->add_phones(); //增加一个phonephone2->set_number("120");phone2->set_type(tutorial::Person::HOME);fstream output("pb.itcast", ios::out | ios::trunc | ios::binary);bool flag = obj.SerializeToOstream(&output);//序列化if (!flag){cerr << "Failed to write file." << endl;return;}output.close();//关闭文件
}void get_addressbook()
{tutorial::AddressBook obj;fstream input("./pb.itcast", ios::in | ios::binary);obj.ParseFromIstream(&input);  //反序列化input.close(); //关闭文件for (int i = 0; i < obj.people_size(); i++){const tutorial::Person& person = obj.people(i);//取第i个peoplecout << "第" << i + 1 << "个信息\n";cout << "name = " << person.name() << endl;cout << "id = " << person.id() << endl;cout << "email = " << person.email() << endl;for (int j = 0; j < person.phones_size(); j++){const tutorial::Person::PhoneNumber& phone_number = person.phones(j);switch (phone_number.type()){case tutorial::Person::MOBILE:cout << "  Mobile phone #: ";break;case tutorial::Person::HOME:cout << "  Home phone #: ";break;case tutorial::Person::WORK:cout << "  Work phone #: ";break;}cout << phone_number.number() << endl;}cout << endl;}
}int main()
{// Verify that the version of the library that we linked against is// compatible with the version of the headers we compiled against.GOOGLE_PROTOBUF_VERIFY_VERSION;set_addressbook(); //序列化get_addressbook(); //反序列化// Optional:  Delete all global objects allocated by libprotobuf.google::protobuf::ShutdownProtobufLibrary();return 0;
}

06. 编译和测试

编译和测试

deng@itcast:/mnt/hgfs/LinuxHome/day03$ g++  test.cpp addressbook.pb.cc `pkg-config --libs --cflags protobuf`
deng@itcast:/mnt/hgfs/LinuxHome/day03$ ./a.out
第1个信息
name = tom
id = 1
email = tom@qq.comMobile phone #: 110Home phone #: 120deng@itcast:/mnt/hgfs/LinuxHome/day03$

07. 附录

官方参考:https://developers.google.cn/protocol-buffers/docs/reference/cpp-generated#package

测试代码下载:测试代码下载

【Protocol Buffer】Protocol Buffer入门教程(六):枚举和包相关推荐

  1. TypeScript入门教程 之 枚举 Enums

    TypeScript入门教程 之 枚举 Enums 枚举是一种组织相关值集合的方法.许多其他编程语言(C / C#/ Java)具有enum数据类型,而JavaScript没有.但是,TypeScri ...

  2. R语言七天入门教程六:文件相关操作

    R语言七天入门教程六:文件相关操作 一.文件的读写 R 语言作为统计学编程语言,常常需要处理大量数据,而这些数据通常会从文件中进行读取,因此文件读写在R语言中是非常重要的操作.在R语言中,用到最多的文 ...

  3. 【MATLAB Image Processing Toolbox 入门教程六】“导入、导出和转换”之“图像类型转换Ⅰ——在不同图像类型之间转换”

    [MATLAB Image Processing Toolbox 入门教程六] 1 gray2ind函数 2 ind2gray函数 3 mat2gray函数 4 rgb2gray函数 5 rgb2in ...

  4. 无废话ExtJs 入门教程六[按钮:Button]

    无废话ExtJs 入门教程六[按钮:Button] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个两个按钮"提交"与重置.如下所示代码区的第6 ...

  5. ROS2入门教程—创建ROS2功能包(C++版)

    ROS2入门教程-创建ROS2功能包(C++版) 1 ROS2中的功能包 2 创建功能包 3 编译功能包 4 设置环境变量 5 运行功能包 6 功能包中的内容 7 修改package.xml文件    ...

  6. 物权法全文内容有哪些呢-广告外链_SEO入门教程六:如何发外链?外链优化方法...

    咱们继续,好不?这是SEO入门教程第六篇. 现在发外链还有作用吗?很多人都会提出这样的疑问,其实,现在外链的占比还是很大,但是现在百度对于外链的限制很多. 百度不断更新算法就是为了打击作弊外链.垃圾外 ...

  7. protobuf入门教程(六):导入定义(import)

    消息格式 info.proto文件内容如下: syntax = "proto3";//指定版本信息,不指定会报错package infopack; //package声明符mess ...

  8. php连接服务器,php入门教程六(php实现连接ftp服务器与IMAP服务器)

    根据上面的实例我们总结了,本文章主要是讲到imap服务器连接以及与ftp服务器进行连接详细教程,包括删除,上传,下载文件实例 用php教程实现连接服务器,还有实现连接imap服务器,最后通过php编写 ...

  9. SpringCloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务

    首先简单解释一下什么是声明式实现? 要做一件事, 需要知道三个要素,where, what, how.即在哪里( where)用什么办法(how)做什么(what).什么时候做(when)我们纳入ho ...

最新文章

  1. ednote服务器运行失败,endnote搜索文献时连不上服务器 Endnote连接服务器问题
  2. IDA-3D:基于立体视觉的深度感知3D目标检测网络(CVPR2020)
  3. Python的Flask入门
  4. 板材开料最优算法_板材套料软件AutoNest与Tekla Structures协同工作实现设计到加工自动化...
  5. 七十五、栈+双指针,头条当年接雨水问题
  6. apache应用进阶
  7. 浅谈 Celery 分布式队列
  8. shell判断字符串为空
  9. Realsense D435i 使用
  10. 2020年鼠年春节贺词祝福大全
  11. Touchgfx - 4 - Bitmap Cache
  12. 两数之和——python
  13. JAVA使用OPC UA 方式与设备通信(milo)
  14. 一套实用性最强的商业方案,让他白手起家做到全国十大财阀之一!
  15. 4GDTU称重系统无线监测系统
  16. 解决 Navicat 无法导入带外键的json 亲测有效!
  17. Power Apps平台利用CDS(Common Data Service)制作问卷调查
  18. [笔记]NFC笔记——WUP_REQ 和 WUP_RES 消息结构
  19. 从零开始在服务器上搭建QQ机器人——插件(二)
  20. Java编程的三个就业方向有哪些

热门文章

  1. XBMC 最新版本错误
  2. gVIM+ctags+Taglist+winmanager搭建IDE
  3. asp.net mvc 正常支持Fckeditor编辑器
  4. jq调用android方法,Android端JQueryMobile使用教程(一)
  5. 第9章例题 7-2 学生成绩排序
  6. matlab中打不开保存好的模糊控制器,【求助大神】模糊控制器仿真,在Simulink运行时出现问题...
  7. 8.36人一次搬36块砖,男搬4,女搬2,两个小孩抬一块,要一次搬完。问:男、女、小孩各多少?
  8. 2013年海康威视校园招聘笔试题
  9. 木马入侵查杀 linux
  10. bzoj 4551: [Tjoi2016Heoi2016]树【并查集】