00. 目录

文章目录

  • 00. 目录
  • 01. 消息格式
  • 02. 参考程序
  • 03. 编译测试
  • 04. 附录

01. 消息格式

info.proto文件内容如下:

syntax = "proto3";//指定版本信息,不指定会报错package infopack; //package声明符message info //message为关键字,作用为定义一种消息类型
{string addr = 1;    //地址string group = 2;   //分组
}

addressbook.proto文件内容如下,addressbook.proto文件需要导入info.proto文件的内容:

syntax = "proto3";//指定版本信息,不指定会报错import "info.proto"; //导入定义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为数组//info定义在"info.proto"//类型格式:包名.信息名infopack.info tmp = 5;
}message AddressBook
{repeated Person people = 1;
}

02. 参考程序

#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);//info addr和group的使用infopack::info *p_info = p1->mutable_tmp(); //取出info的对象指针p_info->set_addr("China");  //地址p_info->set_group("A");     //组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;}//info addr和group的使用infopack::info info = person.tmp(); //取出info的对象cout << "addr = " << info.addr() << endl;cout << "group = " << info.group() << 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$ protoc addressbook.proto info.proto --cpp_out=./
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. 附录

测试程序下载:

【Protocol Buffer】Protocol Buffer入门教程(七):导入定义相关推荐

  1. 图像设定阈值二值matlab,“图像类型转换II——使用“导入、导出和转换”中的“阈值法”转换为二值图像”,MATLABImageProcessingToolbox,入门教程,七,之...

    1 imbinarize函数 在 [MATLAB Image Processing Toolbox 入门教程二]快速入门之"亮度校正"和"目标识别" 中我们已经 ...

  2. Gemini.Workflow 双子工作流入门教程二:定义流程:流程节点介绍

    简介: Gemini.Workflow 双子工作流,是一套功能强大,使用简单的工作流,简称双子流,目前配套集成在Aries框架中. 下面介绍本篇教程:流程定义:流程节点属性. 流程节点: 左侧是节点工 ...

  3. 图深度学习,入门教程七,残差多层图注意力模型

    深度学习还没学完,怎么图深度学习又来了?别怕,这里有份系统教程,可以将0基础的你直接送到图深度学习.还会定期更新哦. 主要是基于图深度学习的入门内容.讲述最基本的基础知识,其中包括深度学习.数学.图神 ...

  4. 【大白话学习】UniApp 微信小程序与APP应用 开发零基础入门教程(七)---登陆注销功能与微信小程序测试号的申请

    到此为止,我们只差一个退出登陆功能了. 回到index.vue页面,之前我们已经预留了退出按钮,现在给它加上功能 <button class="mybutton" type= ...

  5. LTspice 入门教程3 导入仿真模型

    LTspice 最初是由凌力尔特(Linear Techonology)公司开发的,里面大部分器件是 LT 的. 很多运放器件是 TI 家的,LTspice 里没有.尽管 TI 发布的器件仿真模型是 ...

  6. linux入门教程(七) linux系统用户以及用户组管理

    关于这部分内容,笔者在日常的linux系统管理工作中用到的并不多,但这并不代表该内容不重要.毕竟linux系统是一个多用户的系统,每个账号都干什么用,你必须了如指掌.因为这涉及到一个安全的问题. [认 ...

  7. 前端入门教程(七)CSS属性设置

    宽和高 width属性可以为元素设置宽度. height属性可以为元素设置高度. 块级标签才能设置宽度,内联标签的宽度由内容来决定. 字体属性 文字字体 font-family可以把多个字体名称作为一 ...

  8. SpringCloud 入门教程(七): 熔断机制 -- 断路器

    对断路器模式不太清楚的话,可以参看另一篇博文:断路器(Curcuit Breaker)模式,下面直接介绍Spring Cloud的断路器如何使用. SpringCloud Netflix实现了断路器库 ...

  9. SpringBoot入门教程(七)整合themeleaf+bootstrap

    Thymeleaf是用于Web和独立环境的现代服务器端Java模板引擎.Thymeleaf的主要目标是将优雅的自然模板带到您的开发工作流程中-HTML能够在浏览器中正确显示,并且可以作为静态原型,从而 ...

最新文章

  1. 程序员如何讲清楚技术方案
  2. NLP(Natural Language Processing)
  3. Fire Workflow FAQ
  4. freebsd php 编译 mysql sql2005_问下:Freebsd下用php连接ms sql server
  5. 机器人学一些概念1——自由度冗余,映射和操作算子
  6. Linux中常见服务对应的端口号
  7. 讲讲大厂面试必考的假设检验
  8. swagge php token,swagger在thinkphp6的使用方式
  9. 04.卷积神经网络 W2.深度卷积网络:实例探究
  10. UINT_MAX输出后为什么是-1
  11. html 音频格式,html5中audio支持音频格式
  12. 关于ABAP事件的一张图
  13. 使用cfssl生成证书时报json: cannot unmarshal object into Go value of type []csr.Name错误
  14. 面试:C++实现访问者模式
  15. WPF中的Application类。
  16. 如何利用计算机技术检索文献,文献检索过程作业怎么写
  17. Tecohoo VD-206全高清视频会议摄像机
  18. 再见!永远的21号!马刺退役邓肯21号球衣
  19. pygraphviz的安装与红黑树可视化
  20. 简练软考知识点整理-项目收尾过程组

热门文章

  1. linux ps aux 结果解释
  2. ecshop 奇偶行显示不同的商品样式
  3. 使用squid代理时出现“The requested URL could not be retrieved”
  4. 在使用Asp.net制作网站的时候遇到的问题(二)
  5. 荆门 php,荆门php培训
  6. 第10章 例题 7-3 递归实现逆序输出整数
  7. linux创建表空间 没有权限,Linux oracle数据库创建表空间、用户并赋予权限
  8. Java黑皮书课后题第5章:5.40(模拟:正面或反面)编写程序,模拟抛硬币一百万次,显示出现正面和反面的次数
  9. freebsd 手工安装zabbix2.0 php,zabbix 服务端,子客户端安装配置日志
  10. 2013豆瓣校园招聘研发类笔试题