protobuf底层原理深度分析

文章目录

  • 前言
  • 一、protobuf是什么?
  • 二、Protobuf编解码方式
    • Varints 编码
    • ZigZag 编码
  • 三、Protobuf数据存储方式
    • T-V(Tag-Value)存储方式
    • Tag
  • 四、Protobuf序列化原理
  • 五、Protobuf序列化示例


前言

前面利用的到protobuf作为rpc的通讯协议,
c++与golang利用protobuf进行通讯
但是没有真正得深入研究过。
本文将不再介绍如何使用它而是深入研究protobuf协议,本文从编解码方式、数据存储方式以及序列化原理三个方面出发深度分析其底层原理。

一、protobuf是什么?

Protobuf(Protocol Buffers)是一种轻量级、高效、可扩展的数据交换格式,由 Google 开发和维护。它采用二进制编码,能够将数据进行高效压缩,同时具有良好的跨语言性和平台无关性,可以在不同的编程语言和操作系统之间进行数据交换。
常见数据交互格式对比:
JSON (JavaScript Object Notation):一般用于WEB项目中,因为浏览器对JSON格式的数据支持非常好,大部分编程语言有很多内建函数支持,而且JSON几乎支持所有编程语言。
XML:XML在WebService中的应用比较多,相比于JSON,它的数据更加冗余,因为需要成对的闭合标签,而JSON使用了键值对的方式,不仅压缩了一定的数据空间,同时也有更好的可读性。
Protobuf:谷歌公司新开发的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为Protobuf是二进制数据格式,需要编码和解码。数据本身不具有可读性,因此只能反序列化得到可读数据。
相对于其他数据格式Protobuf的优势:
1、序列化后体积比JSON和XML小,适合网络传输。
2、序列化反序列化速度快,比JSON的处理速度快。
3、消息格式升级和兼容性还不错。
Protobuf的优点和缺点

  1. 高效性:Protobuf 使用二进制编码,相比于 XML 和 JSON 等文本格式,可以将数据压缩到更小的体积,从而减少网络传输的带宽和时间。同时,Protobuf 采用了“变长编码”机制,可以根据数据的大小动态调整编码长度,从而提高编解码的效率。
  2. 可扩展性:Protobuf 的数据结构非常灵活,可以方便地添加、删除和修改字段,从而支持数据结构的版本升级和兼容性。同时,Protobuf 支持定义嵌套和枚举类型,可以表示更复杂的数据结构。
  3. 跨语言性:Protobuf 支持多种编程语言,包括 C++、Java、Python、Go 等,可以在不同的编程语言之间进行数据交换。而且,由于 Protobuf 使用 IDL(接口定义语言)来描述数据结构,因此可以自动生成不同编程语言的代码,方便使用者进行开发和集成。
  4. 平台无关性:Protobuf 的数据格式与操作系统和硬件平台无关,可以在不同的操作系统和硬件平台之间进行数据交换。
  5. 易用性:Protobuf 的 API 简单易用,可以方便地序列化和反序列化数据,从而快速实现数据的传输和存储。
    缺点:
    Protobuf功能简单,无法用来表示复杂的概念。
    相比xml,xml具有某种程度的自解释性,因为最终是转成二进制流,不像xml和json能够直接查看明文。

二、Protobuf编解码方式

Varints

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值