一文简单聊聊protobuf

news2024/11/26 1:29:48

目录

基本介绍

原理

同类对比

为什么要使用protobuf?


基本介绍

protobuf的全称是Protocol Buffer,是Google提供的一种数据序列化协议。Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。  

结构化数据是最为常见和熟悉的数据形态,它由明确定义的信息组成,并以高度组织化的表格或数据库进行存储和管理。正如字面上表达的,就是带有一定结构的数据。比如电话簿上有很多记录数据,每条记录包含姓名、ID、邮件、电话等,这种结构重复出现。

目前Protobuf官方工程主页上显示的已支持的开发语言多达10种,分别有:C++、Java、Python、Objective-C、C#、JavaNano、JavaScript、Ruby、Go、PHP,基本上主流的语言都已支持 

 

  • 2001年初,Protobuf首先在Google内部创建, 我们把它称之为 proto1,一直以来在Google的内部使用,其中也不断的演化,根据使用者的需求也添加很多新的功能,一些内部库依赖它。几乎每个Google的开发者都会使用到它。
  • Google开始开源它的内部项目时,因为依赖的关系,所以他们决定首先把Protobuf开源出去。 proto1在演化的过程中有些混乱,所以Protobuf的开发者重写了Protobuf的实现,保留了proto1的大部分设计,以及proto1的很多的想法。但是开源的proto2不依赖任何的Google的库,代码也相当的清晰。2008年7月7日,Protobuf开始公布出来。
  • Protobuf公布出来也得到了大家的广泛的关注, 逐步地也得到了大家的认可,很多项目也采用Protobuf进行消息的通讯,还有基于Protobuf的微服务框架GRPC。在使用的过程中,大家也提出了很多的意见和建议,Protobuf也在演化,于2016年推出了Proto3。 Proto3简化了proto2的开发,提高了开发的效能,但是也带来了版本不兼容的问题。

原理

ProtoBuf 是通过ProtoBuf编译器将与编程语言无关的特有的 .proto 后缀的数据结构文件编译成各个编程语言(Java,C/C++,Python)专用的类文件,然后通过Google提供的各个编程语言的支持库lib即可调用API。

同类对比

XML、JSON 也可以用来存储此类结构化数据,但是使用ProtoBuf表示的数据能更加高效,并且将数据压缩得更小。

协议场景举例
xml主要在本地使用UI,游戏信息
jsonhttp apiHTTP网页注册账户
protobuf服务与服务的远程调用rpc,游戏,即时通讯,tars brpc

protobuf序列化后的大小是json的10分之一,是xml格式的20分之一,但是性能却是它们的5~100倍,我觉得用户一定会尖叫的:oh my god!。 

如果有我们有一个 person 对象,用 JSON、XML 和 protobuf 表示下它们各是什么样。

用 XML 格式表示如下

<person>
    <name>ivy</name>
    <age>24</age>
</person>

用 JSON 格式表示如下

{
    "name":"ivy",
    "age":24
}

用 protobuf 表示如下, 它直接用二进制来表示数据,不像上面 XML 和 JSON 格式那么直观

[10 6 69 108 108 105 111 116 16 24]

三种格式优点:

  • json优点就是较XML格式更加小巧,传输效率较xml提高了很多,可读性还不错。
  • xml优点就是可读性强,解析方便。
  •  protobuf优点就是传输效率快,序列化后体积相比Json和XML很小,支持跨平台多语言,消息格式升级和兼容性还不错,序列化反序列化速度很快。

三种格式缺点:

  • json缺点就是传输效率也不是特别高(比xml快,但比protobuf要慢很多)。
  • xml缺点就是效率不高,资源消耗过大。
  • protobuf缺点就是使用不太方便。 

为什么要使用protobuf?

使用protobuf的原因肯定是为了解决开发中的一些问题,那使用其他的序列化机制会出现什么问题呢?

  • (1)java默认序列化机制:效率极低,而且还能不能跨语言之间共享数据。
  • (2)XML常用于与其他项目之间数据传输或者是共享数据,但是编码和解码会造成很大的性能损失。
  • (3)json格式也是常见的一种,但是在json在解析的时候非常耗时,而且json结构非常占内存。

但是我们protobuf是一种灵活的、高效的、自动化的序列化机制,可以有效的解决上面的问题。

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

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

相关文章

linux系统下文件操作常用的命令

一、是什么 Linux 是一个开源的操作系统&#xff08;OS&#xff09;&#xff0c;是一系列Linux内核基础上开发的操作系统的总称&#xff08;常见的有Ubuntu、centos&#xff09; 系统通常会包含以下4个主要部分 内核shell文件系统应用程序 文件系统是一个目录树的结构&…

出行平台采集机票价格信息

在上述Python代码中&#xff0c;首先引入了所需的模块&#xff0c;然后设置了代理信息和模拟浏览器访问的网页请求头。随后&#xff0c;使用requests库发送代理请求&#xff0c;并将返回的网页内容解析为HTML。接着&#xff0c;从HTML中提取所需的信息&#xff0c;比如机票价格…

实用篇-ES环境搭建

ES(elasticsearch) 是一个开源的分布式搜索引擎&#xff0c;可以用来实现搜索、日志统计、分析、系统监控等功能 elastic stack 是elasticsearch为核心的技术栈&#xff0c;包括beats、logstash(用作数据收集)、kibana(负责图形展示)、elasticsearch(负责数据搜索&#xff0c;…

mysq,数据库的综合查询

记录一下数据库综合查询&#xff0c;复习加深印象 创建教学数据库中包含四个基本表&#xff1a; 教师情况表Teacher&#xff08;Tno 教师号&#xff0c;TName 教师名&#xff0c;TDept 教师所在的院系&#xff09;&#xff1b;课程基本表Course&#xff08;Cno 课号&#xff…

Network(一)计算机网络介绍

一 计算机网络 1 概述 什么是计算机网络&#xff1f; 硬件方面:通过线缆将网络设备和计算机连接起来 软件方面:操作系统&#xff0c;应用软件&#xff0c;应用程序通过通信线路互连 实现资源共享、信息传递、增加可靠性、提高系统处理能力 2 网络与云计算 3 计算机网…

AI创作系统ChatGPT源码+AI绘画系统+支持OpenAI DALL-E3文生图,可直接对话文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。新增支…

UWB应用于金属工具管理

超宽带&#xff08;Ultra-Wideband&#xff0c;UWB&#xff09;技术在金属工具管理方面有许多应用案例&#xff0c;它可以帮助提高工具管理的效率、安全性和精确度。以下是一些UWB在金属工具管理中的应用案例&#xff1a; 工具定位和跟踪&#xff1a;UWB技术可以用于实时定位和…

网络运维Day15

文章目录 Prometheus简介环境准备配置模板机环境部署阿里镜像源实验环境准备 部署prometheus服务查看及测试 Promethues 被监控端Grafana简介部署 Grafana 服务器修改数据源 监控数据库安装部署Mariadb安装导出器修改 Prometheus服务端配置Grafana配置 总结 Prometheus简介 Pr…

MobileSAM论文笔记

摘要 自Meta研究团队发布SAM&#xff08;Segment Anything Model&#xff09;项目依赖&#xff0c;因其令人惊艳的零样本迁移特性和与其他视觉应用兼容的高通用性&#xff0c;引起了极大的关注。由于大多数类似的应用都需要运行在资源限制的边缘设备&#xff0c;如手机&#x…

苹果独占鳌头,国产手机围攻,双十一“照妖镜”显露谁有真实力

随着双十一购物节的结束&#xff0c;电商平台也给出了各手机品牌的销量数据&#xff0c;苹果毫无疑问成为双十一的赢家&#xff0c;不过两家国产手机品牌也显露了他们的实力&#xff0c;已具有与苹果一战之力。 与去年双十一和今年618类似&#xff0c;苹果仍然占据热销榜前列&a…

YOLOv8-Seg改进:SPPF系列改进篇 | 大核分离卷积注意力模块( Large Separable Kernel Attention)

🚀🚀🚀本文改进:大核分离卷积注意力模块( Large Separable Kernel Attention),实现涨点的目标并且降低计算复杂度和显存,引入到YOLOv8,与SPPF结合实现二次创新; 🚀🚀🚀Large Separable Kernel Attention 亲测在多个数据集能够实现涨点,同样适用于小目标分…

自己动手重装电脑Win10系统方法教程

如果我们自己电脑系统出现问题了&#xff0c;无法通过简单的操作解决&#xff0c;这时候最佳的解决方法&#xff0c;就是给电脑重装安装操作系统。有用户想给电脑重装Win10系统&#xff0c;但不清楚具体的重装步骤方法&#xff0c;下面小编就给大家详细介绍自己手动重新安装Win…

win下oracle安装与navicat远程连接配置

oracle安装 navicat远程连接配置 1、打开navicat&#xff0c;工具>选项>环境 2、配置 找到oracle安装目录 3、连接

7.jvm对象内存布局

目录 概述对象里的三个区对象头验证代码控制台输出分析 验证2代码控制台输出 实例数据对其填充 访问对象结束 概述 jvm对象内存布局详解。 相关文章在此总结如下&#xff1a; 文章地址jvm基本知识地址jvm类加载系统地址双亲委派模型与打破双亲委派地址运行时数据区地址运行时数…

【C/PTA——8.数组2(课外实践)】

C/PTA——8.数组2&#xff08;课外实践&#xff09; 7-4 矩阵运算7-2 方阵循环右移7-3 螺旋方阵7-4 数组-杨辉三角7-5 数组-对角线求和7-6 数组-矩阵最小值 7-4 矩阵运算 #include<stdio.h> int main() {int n, i, j;int a[10][10] { 0 };scanf("%d", &n)…

CodeEase标准化的低代码平台

目录 一、引言二、网站简介三、网站特色四、为什么推荐这个网站&#xff1f;五、总结 一、引言 随着互联网的快速发展&#xff0c;我们每天都会浏览各种各样的网站。今天&#xff0c;我想向大家推荐一个独特而出色的网站——CodeEase&#xff0c;这是一个致力于为用户提供便捷…

LLM App ≈ 数据ETL管线

虽然现有的 LLM 应用程序工具&#xff08;例如 LangChain 和 LlamaIndex&#xff09;对于构建 LLM 应用程序非常有用&#xff0c;但在初始实验之外不建议使用它们的数据加载功能。 当我构建和测试我的LLM应用程序管道时&#xff0c;我能够感受到一些尚未开发和破解的方面的痛苦…

TrOCR模型微调【基于transformer的光学字符识别】

TrOCR&#xff08;基于 Transformer 的光学字符识别&#xff09;模型是性能最佳的 OCR 模型之一。 在我们之前的文章中&#xff0c;我们分析了它们在单行打印和手写文本上的表现。 然而&#xff0c;与任何其他深度学习模型一样&#xff0c;它们也有其局限性。 TrOCR 在处理开箱…

任正非说:要提高合同质量,使我们从广种薄收转向有效益的扩张。

你好&#xff01;这是华研荟【任正非说】系列的第38篇文章&#xff0c;让我们聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 华研荟注&#xff1a;前两天为大家分享了任正非先生讲话中关于IPD、ISC、LTC流程的一些内容。今天来看看任正非对于合同的要求…

Programming Abstractions in C阅读笔记:p196

《Programming Abstractions in C》学习第63天&#xff0c;p196总结。涉及到编程之外的知识&#xff0c;依然是读起来很费劲&#xff0c;需要了解作者在书中提到的人物(Edouard Lucas)、地点(Benares)、神话传说(Brahma)等等。虽然深知自己做不到对人文知识&#xff0c;历史知识…