一文简单聊聊protobuf

目录

基本介绍

原理

同类对比

为什么要使用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是一种灵活的、高效的、自动化的序列化机制,可以有效的解决上面的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue 3.0 + vite + axios+PHP跨域问题的解决办法

最后一个Web项目&#xff0c;采用前后端分离。 前端&#xff1a;Vue 3.0 viteelement plus 后端&#xff1a;PHP 运行时前端和后端是两个程序&#xff0c;前端需要时才向后端请求数据。由于是两个程序&#xff0c;这就会出现跨域问题。 比如前端某个地方需要请求的接口如下…

2023年度实用Figma插件大放送!

根据统计&#xff0c;自2018年以来&#xff0c;Sketch的使用率已经从42%下降到31%&#xff0c;而Figma的使用率已经从12%上升到26%。为什么Figma如此受欢迎&#xff1f;为什么有越来越多的设计师倾向于使用Figma做设计&#xff1f;其实Figma现在除了给用户带来的丝滑的操作体验…

KT148A语音芯片的下载用的是串口,测试可以直接串口发指令控制吗

一、问题简介 KT148A语音芯片的下载用的是串口&#xff0c;那我实际测试是不是可以直接串口发指令测试控制&#xff1f;就不用单独写程序去模拟一线串口的时序了 详细描述 首先看一下KT148A芯片的参考设计原理图&#xff1a;其中芯片的2脚和3脚就是串口&#xff0c;注意下载语…

跨国企业在数据跨境传输中应该知道的五大要点

随着全球化的加速和数字化经济的蓬勃发展&#xff0c;数据跨境传输已经成为跨国企业日常业务运营中的重要环节。然而&#xff0c;在数据跨境传输过程中&#xff0c;企业需要关注一系列问题&#xff0c;以确保遵守法律法规、保障数据安全、提高传输效率并降低风险。本文将探讨数…

Office LTSC 2021 v16.80

Office 2021 for Mac是一款针对Mac用户推出的办公软件套装&#xff0c;包括了Word、Excel、PowerPoint、Outlook等常用的办公软件。相比于之前的版本&#xff0c;Office 2021 for Mac也进行了一些更新和改进&#xff0c;以提高用户的使用体验和效率。 以下是Office 2021 for M…

Python使用Mechanize库完成自动化爬虫程序

Mechanize是一个Python第三方库&#xff0c;它可以模拟浏览器的行为&#xff0c;实现自动化的网页访问、表单填写、提交等操作。下面是一个使用Mechanize库编写的爬虫的例子&#xff0c;它可以爬取百度搜索结果页面的标题和链接&#xff1a; import mechanize from bs4 import …

宝马所有发动机号码的位置以及型号说明

每个汽车制造商都会为自己生产的汽车底盘和发动机分配一个内部代码&#xff0c;以标识研发和生产项目&#xff0c;而宝马对这些底盘代码和发动机代码更是规划的井井有条&#xff0c;比如发动机有M、N、B、S、P或W等代码标识&#xff0c;而底盘和车身则有E、F、G或i等代码标识。…

Nginx 版本信息泄露解决方案

Nginx 【CVE-2021-23017;CVE-2022-41742】 【影响】 攻击者可能使用泄露的版本信息来确定该版本服务器有哪些安全漏洞&#xff0c;据此展开进一步的攻击。以下是百度的请求示例&#xff0c;也是有版本泄露&#xff1a; 【解决方案】 在Server节点增加以下配置&#xff1a; #…

3.4 Linux 软件管理

一. RPM 软件包管理器 1、软件包介绍 RPM&#xff08;RedHat Package Manager&#xff09;软件包&#xff1a;扩展名为“.rpm”。RPM本质上就是一个包&#xff0c;包含可以立即在特定机器体系结构上安装和运行的Linux软件。安装RPM软件包需要使用rpm命令或yum命令。 源代码软…

vue3中父子组件传值

学习参考地址&#xff1a;【精选】Vue3父子组件间传参通信_vue3父子组件传参-CSDN博客 1、父传子 父组件直接通过属性绑定的方式给子组件绑定数据&#xff0c;子组件通过defineProps接收函数接收&#xff0c;例如&#xff1a; 父组件中&#xff1a; 子组件中接收props&#…

Leetcode1334. 阈值距离内邻居最少的城市

Every day a Leetcode 题目来源&#xff1a;1334. 阈值距离内邻居最少的城市 解法1&#xff1a;Floyd 算法 使用 Floyd 算法得到任意两点之间的最短路&#xff0c;然后统计每一个节点满足条件&#xff08;距离在 distanceThreshold 以内&#xff09;的邻居数量。 代码&…

Mysql词法分析实验(二)

表名叫select123能不能创建一个表&#xff1f; 在 MySQL 中&#xff0c;可以创建一个名为 select123 的表&#xff0c;但由于 SELECT 是 MySQL 的一个保留关键字&#xff0c;通常建议避免使用它作为表名的一部分&#xff0c;以防止潜在的解析错误或混淆。如果确实需要使用这样…

带头双向循环链表的实现

带头双向循环链表的实现 文章目录 带头双向循环链表的实现一、模型构建二、代码实现&#xff08;接口函数以及测试用例&#xff09;①初始化 Create函数②尾插③尾删④头插⑤头删⑥查找⑦在pos位置前插入新尾插新头插 ⑧删除pos位新尾删新头删 ⑨销毁链表⑩打印链表⑪测试用例…

SAP Debug时如何跳过(不执行)某些代码

Debug时如何跳过(不执行)某些代码 在DEBUG界面, 首先将光标定位到想跳至的代码行, 然后从右键菜单中选择Goto Statement, 或者从Debugger菜单中选择Goto Statement:&#xff08;效果相同&#xff09; 然后光标就会定位到想跳至的代码行 执行结果如下: 结果是000的原因是&#…

保姆级前端翻牌效果(CSS)

效果 翻牌效果 hover 时候 代码直接上 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

微服务的注册发现和微服务架构下的负载均衡

文章目录 微服务注册模型服务注册与发现怎么保证高可用【1. 服务端崩溃检测】【2. 客户端容错】【3. 注册中心选型】 微服务架构下的负载均衡【1.轮询与加权轮询】【2.随机与加权随机】【3.哈希与一致性哈希】【4.最少连接数】【5.最少活跃数】【6.最快响应时间】【总结】 负载…

消防救援大队应用“码“上监管 实现重点领域监督全覆盖

近年以来&#xff0c;一直存在消防安全风险防控不精准、问题发现不及时、监督效果不明显等难点问题&#xff0c;我们充分利用信息化手段&#xff0c;探索开通“码上监督”网络举报平台&#xff0c;实现监督途径从“线下”拓展到“线上”&#xff0c;“码上监督”马上办。 问题…

容器size()无符号数导致的for循环崩溃

1.问题描述 容器size()无符号数导致的for循环崩溃 for (int index 0; index < static_cast(intVec.size())-1; index) { printf(“%d”,intVec[index]); } 如果不做强转&#xff0c;可能会有两个问题&#xff1a; &#xff08;1&#xff09;编译不过 &#xff08;2&#x…

K8S 集群搭建

1、搭建清单 2台linux服务器&#xff08;一个master节点&#xff0c;一个node节点&#xff09;&#xff0c;建议搭3台&#xff08;一个master&#xff0c;两个node&#xff09; 我使用的是腾讯云&#xff0c;节点与节点使用公网IP通信 确保2台服务器都安装了docker 2、服务…

unity 使用Vuforia扫描实体物体交互

文章目录 前言一、Vuforia是什么&#xff1f;二、Unity导入Vuforia1.去Unity - Windows – Asset Store&#xff0c;搜vuforia engine&#xff0c;添加到我的资源2.从 Unity 的菜单 Assets -> Import package -> Custom Package 导入脚本&#xff0c;添加 Vuforia Engine…