Protobuf简单介绍

首先Protobuf是google公司提出的一种序列化方法,因为其在网络传输中优点较多,同时使用简单方便维护,因此现如今Protobuf以及逐渐取代Json来传输数据。

Protobuf与Json的对比

  • 创建一个.proto文件,在该文件中定义了两个消息结构(student,teacher),
  • 消息结构在C++中对应的类分别为:student、teacher

如果我们使用Protobuf进行传输时,只需要对类进行赋值即可。

//name、age、gender分别为student类与teacher类的属性
student类:
name:'张三'
age:20
gender:'男'teacher类:
name:'张老师'
age:35
gender:'男'

如果我们使用Json进行数据传输时:
{"student":{"name":"张三","age":"20","gender":"男"},"teacher":{"name":"张老师","age":"35","gender":"男"})

Protobuf的语法

  • 首先是定义语法格式,必须为第一行,表示后面的语法使用的是proto3语法,如果未写,则默认采用proto2语法。
    syntax = "proto3"
  • 导入其他proto文件
    import other.proto
  • 申明作用域,方式产生冲突,类似C++中的namespace
    package “xxx”
  • 定义消息格式
message Student{required string name = 1;required int32 age;required string gender;
}
  1. required:修饰的字段必须要设置
  2. optional:修饰的字段可以有0个值或者1个值
  3. repeated:修饰的字段可以重复任意多次
  4. 在使用期间,除非某个字段一定需要被设置,否则使用optional或者repeated代替
  5. message类似于C++中的class
//创建PersonMsg.proto文件
syntax = "proto3";//使用proto3语法格式
package PersonMsg;message Person
{required string name = 1;required int32 age = 2;required string gender = 3;optional string email = 4;enum Profession //职业{Strudent = 1;Teacher = 2;Worker = 3;}enum PhoneType //电话卡类型{MOBILE = 0; //移动Link = 1;   //联通} message PhoneNumber{requried string number = 1;optional PhonType P_type = 2 [default = Link]; //电话卡默认类型为联通 }repeated PhoneNumber number = 5; //可以重复多次
}message PersonMessage
{repeated Person personInfo = 1;
}

编译上述proto文件,会生成PersonMsg.pb.h与PersonMsg.pb.cc两个文件

  • .h文件中存储的是消息类
  • .cc文件中存储的是对消息的一些操作,set,clear,has等操作
  • Protobuf序列与反序列

#include<iostream>
#include"PersonMsg.pb.h"
using namespace std;char buf[1024];
int main()
{PersonMsg::PersonMessage person;PersonMsg::Person* p = person.add_personInfo();p->set_name("张三");p->set_age(20);p->set_gender("男");if(!p->has_email())//如果获取不到email,表示没有email则对其进行初始化{p->set_email("xxxx@163.com");}PersonMsg::Person::PhoneNumber* phonenum = person.add_number();phonenum->set_number("xxxxx");phonenum->set_P_type("PersonMsg::Person::Link");//设置电话int size = person.ByteSize();person.SerializeToArray(buf,size); //序列化PersonMsg::PersonMessage person2;person2.ParseFromArray(buf,size); //发序列化return 0;
}

Protobuf简单编写与使用相关推荐

  1. linux加protobuf变量环境,protobuf简单介绍和ubuntu 16.04环境下安装教程

    protobuf简单介绍 protobuf是谷歌的开源序列化协议框架,结构类似于XML,JSON这种,显著的特点是二进制的,效率高,主要用于通信协议和数据存储等方面,算是一种结构化数据的表示方法. p ...

  2. python成绩管理系统设计 gui csdn_用golang简单编写学生信息管理系统

    用golang简单编写学生信息管理系统 发布时间:2020-09-04 11:45:16编辑:三青(参考七米老师的视频)查看次数:187 student.gopackage main import & ...

  3. Marp之简单编写PPT格式范例

    Marp之简单编写PPT范例 准备知识 Marp了解+获取 01. 设置页面大小 宽屏代码: <!-- $size: 16:9 -->或者默认标准屏<!-- $size: 4:3 - ...

  4. android扫描文件夹过滤文件夹,Android - 简单编写一个空文件/文件夹的扫描器

    Android - 简单编写一个空文件/文件夹的扫描器 前言 顾名思义,空文件就是大小为0字节的文件,空文件夹就是子目录没有文件或文件夹的文件夹 实际上,这个功能在很早就有了,大概是在2012-201 ...

  5. 【TCP服务器和客户端的简单编写】

    TCP服务器和客户端的简单编写 TCP简介 TCP是什么 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IE ...

  6. Protobuf简单使用

    Protobuf是Google开发一种数据描述语言,能够将结构化数据序列化,可用于数据存储.通信协议等方面.据Google官方文档介绍,现在Google内部已经有48,162个消息类型定义在12,18 ...

  7. 编写简单的hql命令_Makefile的简单编写

    当我们的工程越来越大的以后,每次都使用命令编译显得非常的麻烦.所以我们需要一个自动化编译的工具来帮助我们编译.在我们使用源码安装软件的时候都会有make,make install等操作,这个就是使用M ...

  8. Python 简单编写一个注册邮箱

    金秋九月,又是开学的新的一学期,大家见到新同学新同事一定要问好,不要社死!!! 我们步入正题: 编写一个简单的注册邮箱程序 我在编写这个小程序的时候里面,有的代码是简化了: 还是那句话: 编写程序前, ...

  9. php留言板的简单编写

    关于php留言板简单的编写 小弟第一次写博客,也是第一次写关于程序的博客,写得不好的地方,请提出. 原理 代码 我所遇到的问题 原理 简单的说就是 数据库的创建,添加数据,显示在前端上.我的程序只是简 ...

最新文章

  1. Java集合框架的知识总结(1)
  2. GridView不能添加头布局,并且scrollView与GridView冲突导致一些页面无法融合
  3. spring cloud java b2b2c o2o分布式 微服务电子商务平台
  4. Go语言可能会遇到的坑
  5. source insight搜不到关联代码
  6. 爬虫篇——代理IP爬取备用及存储
  7. c语言编译 64位,cmake – 编译32位和64位
  8. [BUUCTF-pwn]——[BJDCTF 2nd]r2t3
  9. cad怎么把图层英文变成中文_CAD图层管理器昨天是中文的今天怎么变英文 – 手机爱问...
  10. oracle转换请求无法实施,Oracle服务正常,但不响应请求的问题
  11. 如何去掉html body里的 nbsp,html的空格和nbsp怎么去除?
  12. 5年前我在博客中写的三目运算符的空指针问题,终于被阿里巴巴开发手册收录了。...
  13. Linux下ps命令详解
  14. 自己定义了个一类似UISegment的东西
  15. ps抠头发丝教程图解:ps抠图抠头发丝的方法
  16. 微信小游戏开发之使用云开发作为后台服务
  17. 数据库中modify和change的区别
  18. android xcl charts,我写的Android图表库XCL-Charts,整理好现在开源了!!!
  19. 枫叶HD高清视频转换器 V10.2.2.0 官方安装版
  20. python自学1:更改excel内容案例及技术总结

热门文章

  1. Apache发布NetBeans 10.0,增强对JDK 11的支持
  2. Jungle Roads//最小生成树kruskal
  3. 【makefile】检测CC是否修改
  4. 【工具】之搭建个人博客
  5. 数据拟合---使用自定义函数进行非线性拟合 -在Origin。matlab拟合工具箱cftool
  6. 堆和栈区别 java_JAVA中堆和栈的区别
  7. Zookeeper-01-概述
  8. html文字阴影兼容ie,IE之css3效果兼容
  9. flutter图标按钮_Flutter 中的常见的按钮组件 以及自 定义按钮组件
  10. videojs中文文档详解_MMDetection中文文档—详解