Protobuf简单编写与使用
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;
}
- required:修饰的字段必须要设置
- optional:修饰的字段可以有0个值或者1个值
- repeated:修饰的字段可以重复任意多次
- 在使用期间,除非某个字段一定需要被设置,否则使用optional或者repeated代替
- 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简单编写与使用相关推荐
- linux加protobuf变量环境,protobuf简单介绍和ubuntu 16.04环境下安装教程
protobuf简单介绍 protobuf是谷歌的开源序列化协议框架,结构类似于XML,JSON这种,显著的特点是二进制的,效率高,主要用于通信协议和数据存储等方面,算是一种结构化数据的表示方法. p ...
- python成绩管理系统设计 gui csdn_用golang简单编写学生信息管理系统
用golang简单编写学生信息管理系统 发布时间:2020-09-04 11:45:16编辑:三青(参考七米老师的视频)查看次数:187 student.gopackage main import & ...
- Marp之简单编写PPT格式范例
Marp之简单编写PPT范例 准备知识 Marp了解+获取 01. 设置页面大小 宽屏代码: <!-- $size: 16:9 -->或者默认标准屏<!-- $size: 4:3 - ...
- android扫描文件夹过滤文件夹,Android - 简单编写一个空文件/文件夹的扫描器
Android - 简单编写一个空文件/文件夹的扫描器 前言 顾名思义,空文件就是大小为0字节的文件,空文件夹就是子目录没有文件或文件夹的文件夹 实际上,这个功能在很早就有了,大概是在2012-201 ...
- 【TCP服务器和客户端的简单编写】
TCP服务器和客户端的简单编写 TCP简介 TCP是什么 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IE ...
- Protobuf简单使用
Protobuf是Google开发一种数据描述语言,能够将结构化数据序列化,可用于数据存储.通信协议等方面.据Google官方文档介绍,现在Google内部已经有48,162个消息类型定义在12,18 ...
- 编写简单的hql命令_Makefile的简单编写
当我们的工程越来越大的以后,每次都使用命令编译显得非常的麻烦.所以我们需要一个自动化编译的工具来帮助我们编译.在我们使用源码安装软件的时候都会有make,make install等操作,这个就是使用M ...
- Python 简单编写一个注册邮箱
金秋九月,又是开学的新的一学期,大家见到新同学新同事一定要问好,不要社死!!! 我们步入正题: 编写一个简单的注册邮箱程序 我在编写这个小程序的时候里面,有的代码是简化了: 还是那句话: 编写程序前, ...
- php留言板的简单编写
关于php留言板简单的编写 小弟第一次写博客,也是第一次写关于程序的博客,写得不好的地方,请提出. 原理 代码 我所遇到的问题 原理 简单的说就是 数据库的创建,添加数据,显示在前端上.我的程序只是简 ...
最新文章
- Java集合框架的知识总结(1)
- GridView不能添加头布局,并且scrollView与GridView冲突导致一些页面无法融合
- spring cloud java b2b2c o2o分布式 微服务电子商务平台
- Go语言可能会遇到的坑
- source insight搜不到关联代码
- 爬虫篇——代理IP爬取备用及存储
- c语言编译 64位,cmake – 编译32位和64位
- [BUUCTF-pwn]——[BJDCTF 2nd]r2t3
- cad怎么把图层英文变成中文_CAD图层管理器昨天是中文的今天怎么变英文 – 手机爱问...
- oracle转换请求无法实施,Oracle服务正常,但不响应请求的问题
- 如何去掉html body里的 nbsp,html的空格和nbsp怎么去除?
- 5年前我在博客中写的三目运算符的空指针问题,终于被阿里巴巴开发手册收录了。...
- Linux下ps命令详解
- 自己定义了个一类似UISegment的东西
- ps抠头发丝教程图解:ps抠图抠头发丝的方法
- 微信小游戏开发之使用云开发作为后台服务
- 数据库中modify和change的区别
- android xcl charts,我写的Android图表库XCL-Charts,整理好现在开源了!!!
- 枫叶HD高清视频转换器 V10.2.2.0 官方安装版
- python自学1:更改excel内容案例及技术总结
热门文章
- Apache发布NetBeans 10.0,增强对JDK 11的支持
- Jungle Roads//最小生成树kruskal
- 【makefile】检测CC是否修改
- 【工具】之搭建个人博客
- 数据拟合---使用自定义函数进行非线性拟合 -在Origin。matlab拟合工具箱cftool
- 堆和栈区别 java_JAVA中堆和栈的区别
- Zookeeper-01-概述
- html文字阴影兼容ie,IE之css3效果兼容
- flutter图标按钮_Flutter 中的常见的按钮组件 以及自 定义按钮组件
- videojs中文文档详解_MMDetection中文文档—详解