Protobuf用法和实际操作总结

news2024/11/26 21:47:46

Protobuf介绍

Protobuf(下文称为 PB)是一种常见的数据序列化方式,常常用于后台微服务之间传递数据

protobuf 的类图如下: 

f97da244d81481546f1c0599f2b403c3.png

类 Descriptor 介绍

类 Descriptor 主要是对 Message 进行描述,包括 message 的名字、所有字段的描述、原始 proto 文件内容等

Descriptor 类和 Reflection 类都聚合于 Message,是弱依赖的关系。

类名类描述
Descriptor对 Message 进行描述,包括 message 的名字、所有字段的描述、原始 proto 文件内容等
FieldDescriptor对 Message 中单个字段进行描述,包括字段名、字段属性、原始的 field 字段等
Reflection提供了动态读和写 message 中单个字段能力

利用类比思维来理解Descriptor和ProtoBuf的关系

Descriptor->proto

字节码 ->Java类

Protobuf的优点

性能方面

  • 序列化后,数据大小可缩小3倍
  • 序列化速度快
  • 传输速度快

使用方面

  • 使用简单:proto编译器自动进行序列化和反序列化
  • 维护成本低:多平台只需要维护一套对象协议文件,即.proto文件
  • 可扩展性好:不必破坏旧的数据格式,就能对数据结构进行更新
  • 加密性好:http传输内容抓包只能抓到字节数据

使用范围

  • 跨平台、跨语言、可扩展性强

字段解释

// FileName: tutorial.person.proto 
// 通常文件名建议命名格式为 包名.消息名.proto 

// 表示正在使用proto2命令
syntax = "proto2"; 

//包声明,tutorial 也可以声明为二级类型。
//例如a.b,表示a类别下b子类别
package tutorial; 

//编译器将生成一个名为person的类
//类的字段信息包括姓名name,编号id,邮箱email,
//以及电话号码phones
message Person { 

  required string name = 1;  // (位置1)
  required int32 id = 2;  
  optional string email = 3;  // (位置2)

  enum PhoneType {  //电话类型枚举值 
    MOBILE = 0;  //手机号  
    HOME = 1;    //家庭联系电话
    WORK = 2;    //工作联系电话
  } 
  
  //电话号码phone消息体
  //组成包括号码number、电话类型 type
  message PhoneNumber {
    required string number = 1;    
    optional PhoneType type = 
          2 [default = HOME]; // (位置3)
  }  
  
  repeated PhoneNumber phones = 4; // (位置4)
} 


// 通讯录消息体,包括一个Person类的people
message AddressBook { 
  repeated Person people = 1; 

}

包声明

proto 文件以package声明开头,这有助于防止不同项目之间命名冲突。在C++中,以package声明的文件内容生成的类将放在与包名匹配的namespace中,上面的.proto文件中所有的声明都属于tutorial

字段规则

  • required:消息体中必填字段,不设置会导致编解码异常。(例如位置1)
  • optional: 消息体中可选字段,可通过default关键字设置默认值。(例如位置2)
  • repeated: 消息体中可重复字段,重复的值的顺序会被保留(例如位置3)。其中,proto3默认使用packed方式存储,这样编码方式比较节省内存。

标识号

  • 标识号:在消息体的定义中,每个字段都必须要有一个唯一的标识号,标识号是[0,2^29-1]范围内的一个整数。以Person为例,name=1,id=2, email=3, phones=4 中的1-4就是标识号。

数据定义

许多标准的简单数据类型都可以用作message字段类型,包括bool,int32,float,doublestring。还可以使用其他message类型作为字段类型在消息体中添加更多结构。在上面的示例中,Person包含PhoneNumber message, 而AddressBook包含Person message。甚至可以定义嵌套在其他message中的message类型。例如,上面的PhoneNumber定义在Person

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud_第1章_入门到精通()

SpringCloud_第1章_入门到精通 文章目录SpringCloud_第1章_入门到精通1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程2.3.实现远程调用案例2…

几种常用XML文档解析方案的使用操作

几种常用XML文档解析方案的使用操作XML概述组成部分XML示例约束DTDSchema解析XML解析方式常见解析器JAXP的使用准备student.xml文件解析XML文档写入XML文档dom4j的使用Document对象获取方式引入依赖解析XML文档文档写入XMLJsoup的使用引入依赖核心对象解析XML文档JsoupXPath的使…

护眼灯真能保护眼睛吗?2022双十二买什么样的护眼灯对眼睛好

护眼灯对于保护眼睛的效果,比起传统的普通台灯更科学、更直观。我们都知道,传统的普通台灯大多都是白炽灯,采用加热钨丝发热发光的原理来提供照明,这种发光方式不但效率低下、浪费能源、污染环境,而且光线也是特别单一…

(二)DepthAI-python相关接口:OAK Pipeline

消息快播:OpenCV众筹了一款ROS2机器人rae,开源、功能强、上手简单。来瞅瞅~ 编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查…

Word文档格式设置——小课堂

文章目录前言1、调整显示选项2、格式设置2.1、新建空白文档,使用默认格式添加一至六级目录;2.2、设置标题的样式2.3、添加标题序号2.4、设置正文格式2.5 设置表格边框2.6 设置表格段落样式2.7 插入表格题注2.9 设置图片格式,并插入题注3、小技…

xxljob

分为调度中心 执行器 调度中心:提供可视化界面,配置定时任务,定时去调用执行器 调度中心执行器管理:每个springboot作为执行器, 也就是执行器的标识 任务管理:选中执行器,创建改该执行器下的任…

深度学习与总结JVM专辑(六):JVM字节码执行引擎

JVM字节码执行引擎前言运行时栈帧结构方法调用解析虚方法和非虚方法分派静态分派静态类型和实际类型动态分派字段没有多态性单分派和多分派JVM动态分派的实现前言 执行引擎是JVM核心的组成部分之一。 “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执…

vue中含有iframe的页面如何避免路由切换时keep-alive不起作用

路由组件中使用keep-alive 其他组件会正常缓存 但是含有iframe的页面无法正常缓存,这个问题困扰了我很久,也成为了项目目前的一个瓶颈。突然有一天,我们的技术总监推荐给我一篇博文,真的是让我醍醐灌顶,虽然这个keep-a…

详解设计模式:外观模式

外观模式(Facade Pattern),又称为门面模式,是 GoF 的 23 种设计模式中的一种结构型设计模式。 外观模式 是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得…

jeecgboot — docker 搭建 jeecgboot 项目 +本地VUE2 前端

后端: Docker镜像单体启动项目 1. 下载项目 git clone https://gitee.com/jeecg/jeecg-boot.git2. 本地配置host # jeecgboot 127.0.0.1 jeecg-boot-mysql 127.0.0.1 jeecg-boot-redis 127.0.0.1 jeecg-boot-system注意: 如果本地安装了mysql和…

基于PHP+MySQL超市库存管理系统的设计与实现

随着经济的高速发展,超市的信息化工作也在如火如荼地进行,由于超市规模的不断扩大以及商务往来的日益增多,超市对进销存信息的掌握和使用就越来越多,因此以前的原始的手工操作方式就不能适应超市快速发展的需要,在计算机科学技术日益发展和成熟的今天,运用其先进的技术性来管理…

Qt 自定义主题颜色,颜色选择器

灵感及素材来源: 暗玉紫 - 中国色 - 中国传统颜色 (zhongguose.com)http://zhongguose.com/#anyuzi实现效果 中国色 2022-11-29 15-37-121、支持读取颜色配置文件 2、支持动态添加自定义颜色 3、可自由调节颜色RGB值 4、三个圆形按钮显示和调整RGB,四…

nuxtjs中asyncData异步数据请求、代理配置、fetch网络请求、vuex的使用、中间件处理

文章目录1. asyncData异步数据请求2. 代理配置3. fetch网络请求4. vuex4.1 state中的数据展示4.2 同步方法与异步方法4.3 数据持久化处理5. 中间件处理1. asyncData异步数据请求 Nuxt.js 扩展了 Vue.js,增加了一个叫 asyncData 和 fetch 的方法,使得我们…

天宇优配|突然爆雷!大跌15%!

大家好,来一起重视上午的市场行情及最新资讯~ 11月30日上午,上证指数低开0.27%,深证成指跌0.16%,创业板指跌0.16%。盘面上,地产股持续发力,大消费、金融、航运等板块回调。 港股方面,恒指低开0…

命令模式

文章目录思考命令模式1.命令模式的本质2.何时选用命令模式3.优缺点4.实现耦合写法命令模式写法命令模式撤销思考命令模式 命令模式就是解耦强耦合代码,用户只关心功能的实现,开发者却可以利用命令模式在这之间加一些小动作,比如:撤…

天翎知识文档系统+群晖NAS,助力企业实现移动化学习

编者按:移动化学习成为一种社会发展趋势,本文分析了企业移动化学习的意义,并提出了企业移动化学习的一款全新解决方案——天翎知识文档系统群晖NAS。 关键词:多端适配,学习培训,智能问答,在线预…

Javascript脚本运算符执行顺序对照表

Javascript脚本运算符执行顺序对照表:在线查看Javascript脚本运算符执行优先级别 窍门: CtrlF 快速查找 Javascript脚本运算符优先级,是描述在计算机计算表达式时执行运算的先后顺序。Javascript脚本运算符优先级表,同一行中的运算…

巴西队提前出线,预定大力神杯?数据分析告诉你,到底谁才是冠军

2022年卡塔尔世界杯的第一轮小组赛,已经在众多惊诧、悲伤、惊喜的情绪中结束,而仅仅是第一轮的小组比赛,不断爆出的冷门就足以使人大跌眼镜了: 连续34场世界大赛不败的潘帕斯雄鹰——阿根廷,1-2负于世界排名51的沙特&…

天宇优配|百股涨停再现,沪指盘中创近两个月新高

周二A股商场呈现普涨格局,上证指数上涨2.31%,盘中最高点位创出最近两个月新高。各大职业板块近乎全线上涨,地产板块个股掀起涨停潮,数十只地产债盘中涨光临停。此外,A股大金融体现强势,疫苗股则尾盘忽然暴力…

号称Java圣经,Github上爆火的1058页JVM全栈小册到底有什么魅力

对于JVM,我想大部分小伙伴都是要面试了才会去学,其余时间基本不会去看(掐指一算,你们书架上面的深入理解Java虚拟机第三版应该都一层灰了吧【手动狗头】)。但值得一说的是,当你工作多年之后,你遇…