当前位置: 首页 > news >正文

一文简单聊聊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是一种灵活的、高效的、自动化的序列化机制,可以有效的解决上面的问题。

相关文章:

一文简单聊聊protobuf

目录 基本介绍 原理 同类对比 为什么要使用protobuf? 基本介绍 protobuf的全称是Protocol Buffer&#xff0c;是Google提供的一种数据序列化协议。Protocol Buffers 是一种轻便高效的结构化数据存储格式&#xff0c;可以用于结构化数据序列化&#xff0c;很适合做数据存储…...

Unity Meta Quest 一体机开发(五):手势抓取概述

文章目录 &#x1f4d5;教程说明&#x1f4d5; Oculus Integration 中的三种手势抓取方式⭐Hand Grab⭐Touch Hand Grab⭐Distance Hand Grab 此教程相关的详细教案&#xff0c;文档&#xff0c;思维导图和工程文件会放入 Seed XR 社区。这是一个高质量知识星球 XR 社区&#…...

传输层中的TCP和UPD协议

一)应用层协议简介:根据需求明确要传输的信息&#xff0c;明确要传输的数据格式&#xff1b; 应用层协议:这个协议&#xff0c;实际上是和程序员打交道最多的协议了 1)其它四层都是操作系统&#xff0c;驱动&#xff0c;硬件实现好了的&#xff0c;咱们是不需要管 2)应用层:当我…...

插入排序算法(C++版)

1、什么是插入排序 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的基本思想是将一个待排序的数组分为已排序和未排序两个部分&#xff0c;然后逐步将未排序的元素插入到已排序的部分&#xff0c;直到整个数组有序。 2、插入排序的…...

Tracking vs. No-Tracking Queries

学习链接 Tracking queries By default, queries that return entity types are tracking. A tracking query means any changes to entity instances are persisted by SaveChanges. var blog context.Blogs.SingleOrDefault(b > b.BlogId 1); blog.Rating 5; contex…...

Centos7安装frps实现内网穿透

前提 公网设备&#xff1a;云服务器1台&#xff0c;带公网IP 内网设备&#xff1a;linux、群晖、openwrt都可以 我的环境&#xff1a; 云服务器&#xff1a;centos7.9 内网&#xff1a;openwrt软路由 防火墙&&安全组 关闭云服务器的防火墙&#xff1a; 关闭防火墙…...

cryptopp Base64Encoder \n问题

1、问题&#xff1a; new Base64Encoder(new StringSink(out_base)) 调用库函数Base64Encoder进行base64加密后确认多出来了\n 2、原因 base64加密的问题, 由于base64一行不能超过76字符, 超过就会添加回车换行符(在Windows中是 \r\n , 在Linux中是 \n ) 3、解决 方法一、给定参…...

一种艺术风格的神经算法:总结与实现

一、说明 神经风格或神经转移允许以新的艺术风格再现给定的图像。在这里,我介绍了 Leon A. Gatys、Alexander S. Ecker 和 Matthias Bethge 提出的神经风格算法。该算法接收样式图像、内容图像和输入图像,输入图像可以是空的白色图像,也可以是内容图像的副本。因此,…...

【Mysql系列】Mysql基础篇

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

C++面试题之C++中的指针参数传递和引用参数传递

在C中&#xff0c;可以使用指针参数传递和引用参数传递来将参数传递给函数。这两种方法都可以修改函数外部的变量。 指针参数传递: 当使用指针参数传递时&#xff0c;函数接收一个指向变量的指针作为参数。在函数内部&#xff0c;通过解引用指针来访问和修改原始变量的值。这种…...

[Android]Unresolved reference: appcompat

问题 我创建了一个Kotlin class&#xff0c;然后导入并同步了依赖 implementation("androidx.appcompat:appcompat:1.6.1”)&#xff0c;但Class中还是提示报错还是提示Unresolved reference: appcompat 。 代码如下&#xff1a; package com.example.gatestdemol imp…...

网络运维Day14

监控概述 监控的目的 报告系统运行状况每一部分必须同时监控内容包括吞吐量、反应时间、使用率等提前发现问题进行服务器性能调整前&#xff0c;知道调整什么找出系统的瓶颈在什么地方 监控的资源类别 公开数据 Web、FTP、SSH、数据库等应用服务TCP或UDP端口 私有数据 CPU、内…...

Mac常用软件安装

brew安装 brew 是从下载源码解压然后 ./configure && make install &#xff0c;同时会包含相关依存库。并自动配置好各种环境变量&#xff0c;而且易于卸载。 这个对程序员来说简直是福音&#xff0c;简单的指令&#xff0c;就能快速安装和升级本地的各种开发环境。 …...

node 文件上传操作(前端 form表单上传 formData上传 后端 node 使用express+multer)

目录 前端form表单上传formData上传 后端 node 使用expressmulter 前端 form表单上传 <h1>个人信息</h1><form action"http://localhost:3000/api/sendFile" method"post" enctype"multipart/form-data"><label for"…...

容器数据卷+MYSQL实战

什么是容器数据卷&#xff1f; 让我们回忆一下docker理念&#xff1a; 就是将应用和环境打包成一个镜像 数据&#xff1f; 如果数据都在容器中&#xff0c;那么我们删除容器&#xff0c;数据就会丢失 &#xff01;需求&#xff1a;数据持久化就完美了 对于MYSQL&#xff0…...

开发者测试2023省赛--UnrolledLinkedList测试用例

测试结果 官方提交结果 EclEmma PITest 被测文件UnrolledLinkedList.java /** This source code is placed in the public domain. This means you can use it* without any restrictions.*/package net.mooctest;import java.util.AbstractList; import java.util.Collectio…...

HoudahGeo 6 for Mac:掌控地理位置信息的强大工具

在当今这个信息化的世界&#xff0c;地理位置信息的重要性日益凸显。无论是在工作、学习还是生活中&#xff0c;我们都需要理解和利用地理位置信息。如果你正在寻找一个能帮助你更好地管理和理解地理位置信息的工具&#xff0c;那么HoudahGeo 6 for Mac是一个值得考虑的选择。 …...

Xilinx Artix7-100T低端FPGA解码MIPI视频,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优缺点4、详细设计方案设计原理框图OV5640及其配置权电阻硬件方案MIPI CSI-2 RX SubsystemSensor Demosaic图像格式转换Gammer LUT伽马校正VDMA图像缓存AXI4-Stream toVideo OutHDMI输出 5、…...

C与汇编深入分析

汇编怎么调用C函数 直接调用 BL main传参数 在arm中有个ATPCS规则&#xff08;ARM-THUMB procedure call standard&#xff09;&#xff08;ARM-Thumb过程调用标准&#xff09;。 约定r0-r15寄存器的用途&#xff1a; r0-r3&#xff1a;调用者和被调用者之间传递参数r4-r11…...

MySQL中外键的使用及外键约束策略

一、外键约束的概念 外键约束&#xff08;FOREIGN KEY,缩写FK是数据库设计的一个概念&#xff0c;它确保在两个表之间的关系保持数据的一致性和完整性。 外键是指表中的某个字段的依赖于另一张表中某个字段的值&#xff0c;而被依赖的字段必须具有主键约束或者唯一约束&#…...

别再只用Chat了!深度挖掘Cursor的‘规则’与‘上下文’功能,打造你的专属AI编程助手

解锁Cursor的隐藏力量&#xff1a;从代码助手到项目级智能架构师 在AI编程工具爆发的时代&#xff0c;大多数开发者仅仅停留在基础对话和代码补全的层面。但Cursor的真正价值远不止于此——它能够成为你项目架构的智能协作者、团队规范的自动化执行者&#xff0c;以及复杂工程问…...

从MIMO到相控阵:深入浅出聊聊RFSoC的MTS(多片同步)为啥是5G/雷达系统的核心

从MIMO到相控阵&#xff1a;深入浅出聊聊RFSoC的MTS&#xff08;多片同步&#xff09;为啥是5G/雷达系统的核心 在5G Massive MIMO基站的天线阵列背后&#xff0c;或是军用雷达的相控阵天线系统中&#xff0c;数以百计的射频收发通道需要像精密交响乐团般协同工作——任何微小的…...

微型LoRa数传电台:5KM无线通讯,空旷实测无压力

微型LoRa数传电台的通讯距离没有固定数值&#xff0c;从几十米到十几公里都有可能。它强烈依赖于具体的工作环境、设备配置以及天线状况。 一、不同环境下通讯距离&#xff1a; 理想环境 (郊区、农田、沙漠、海上)下3 - 10 公里&#xff0c;收发天线间无任何遮挡&#xff0c;是…...

实战应用:定制专属labelimg,快速生成YOLO格式车辆检测数据集

实战应用&#xff1a;定制专属labelimg&#xff0c;快速生成YOLO格式车辆检测数据集 在计算机视觉项目中&#xff0c;数据标注是模型训练的基础环节。最近我在做一个车辆检测项目时&#xff0c;发现通用的标注工具往往无法完全满足特定需求。比如我需要同时生成PASCAL VOC和YO…...

终极指南:如何用KCN-GenshinServer轻松搭建原神私服

终极指南&#xff1a;如何用KCN-GenshinServer轻松搭建原神私服 【免费下载链接】KCN-GenshinServer 基于GC制作的原神一键GUI多功能服务端。 项目地址: https://gitcode.com/gh_mirrors/kc/KCN-GenshinServer 还在为复杂的命令行配置而头疼吗&#xff1f;KCN-GenshinSe…...

保姆级教程:用Arduino IDE给你的ESP8266写个‘网络诊断’程序,一键排查连接问题

ESP8266网络诊断工具开发实战&#xff1a;从被动排错到主动分析 当你盯着串口监视器里不断滚动的"Connecting..."字样&#xff0c;而ESP8266始终无法连上WiFi时&#xff0c;是否想过——我们本可以做得比盲目重试更聪明&#xff1f;本文将带你开发一个会"思考&q…...

镜像视界|从“静态建模”到“动态空间”:三维重构的终极形态——融合视频流建模与轨迹连续计算的空间智能引擎

镜像视界&#xff5c;从“静态建模”到“动态空间”&#xff1a;三维重构的终极形态——融合视频流建模与轨迹连续计算的空间智能引擎一、问题提出&#xff1a;为什么“建模”始终停留在静态在数字孪生、三维GIS与智慧城市系统中&#xff0c;“建模”一直是核心基础能力。 通过…...

React19 + Tailwindcss V4 实战:手把手教你打造一个高颜值标签输入与随机选择器

React19 Tailwindcss V4 实战&#xff1a;构建智能标签输入与随机决策工具 在今天的快节奏生活中&#xff0c;我们每天都要做出无数选择——从午餐吃什么到周末去哪玩&#xff0c;甚至团队建设时随机点名。作为开发者&#xff0c;我们可以用技术让这些决策过程变得有趣而高效。…...

COMSOL二维单管渗透注浆模拟:简单又强大

comsol二维单管渗透注浆模拟 可以模拟用于多种土层注浆扩散效果 模型简单易懂&#xff0c;注浆管周边网格进行细化 有模拟案例&#xff0c;有视频详细操作最近&#xff0c;我一直在研究注浆技术在土层加固中的应用&#xff0c;特别是在如何模拟注浆过程中的扩散效果。经过一段时…...

如何快速掌握思源宋体:从新手到高手的7天实战计划

如何快速掌握思源宋体&#xff1a;从新手到高手的7天实战计划 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是否曾经在设计中文内容时&#xff0c;为寻找一款既美观又免费的字体而…...