Protobuf根据Varint编码优化序列化

从protobuf实例理解原理以及Varint编码 protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。protobuf特点:ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台。并且客户端和服务端还可以使用不同的语言编写。使用protobuf序列化数据传输速度快,比XML数据快数10倍。主要得益于他的编码方式。扩展性、兼容性好。更新数据结构,不影响和破坏原有的旧程序。 阅读详情

结论

  1. 常用字段、热点字段的字段编号,应该尽量小于15
  2. 如果数值可能为负数,应定义为sint

Protobuf具体实现可以看文档,里面讲的很清楚了。

代码示例

syntax = "proto3";

message Test1 {
  int32 a = 15;
}

message Test2 {
  int32 a = 16;
}

message Test3 {
  sint32 a = 15;
}
 private static void PrintHex(IMessage message)
 {
     // 序列化到内存流
     byte[] serializedBytes;
     using (var stream = new MemoryStream())
     {
         message.WriteTo(stream);
         serializedBytes = stream.ToArray();
     }

     // 打印十六进制字节(空格分隔,大写)
     var hex = BitConverter.ToString(serializedBytes).Replace('-', ' ');
     Console.WriteLine(hex);
 }

 // 基础示例,message变量序列化后是3个字节
 public static void Run()
 {
     var message = new Test1 { A = 150 };
     // 输出: 78 96 01
     PrintHex(message);
 }

 // Tag = (字段编号 << 3) | wire_type。并且一个字节只有低 7 位用来存数据,最高位是标志位。因此Tag(字段键)在字段编号(Field Number)大于等于 16 时,会大于 1 个字节。
 public static void Run2()
 {
     var message = new Test2 { A = 150 };
     // 输出: 80 01 96 01
     PrintHex(message);
 }

 // -1用int32和sint32的区别
 public static void Run3()
 {
     var message = new Test1 { A = -1 };
     // 78 FF FF FF FF FF FF FF FF FF 01
     PrintHex(message);

     var message2 = new Test3 { A = -1 };
     // 78 01
     PrintHex(message2);
 }
gRPC快速入门(二)——Protobuf序列化原理解析 gRPC快速入门(二)——Protobuf序列化原理解析 一、Protobuf序列化原理简介 1、序列化 序列化是将数据结构或对象转换成二进制字节流的过程。Protobuf对于不同的字段类型采用不同的编码方式和数据存储方式对消息字段进行序列化,以确保得到高效紧凑的数据压缩。Protobuf序列化过程如下: (1)判断每个字段是否有设置值,有值才进行编码。(2)根据字段标识号与数据类型将字段值通过不... 阅读详情

相关推荐

Protobuf编码规则详解

Protobuf 编码

prcyang的专栏 1791

一文吃透 Protobuf 编码从 Varint 到 Packed,再到确定性序列化

本文深入解析了Protocol Buffers的线格式编码机制,从基本概念到高级特性全面覆盖。主要内容包括:1)线格式的重要性(调优排障、兼容演进);2)消息结构(tag-value序列与6种wire type);3)核心编码技术(varint压缩、ZigZag编码);4)复合类型处理(LEN定界、子消息、repeated字段);5)高级特性(oneof、map、group);6)工程实践(顺序非确定性、大小限制);7)优化建议(热字段编号、整型选择、packed策略)。最后介绍了Protoscope调试工

hello.reader 1366

深入解析Protobuf的Varint与ZigZag编码机制

本文深入解析了Protobuf中Varint与ZigZag两种核心编码机制。Varint通过可变长编码高效压缩小整数,而ZigZag编码则巧妙解决了负数在Varint中编码效率低下的问题,将负数映射为小正数。文章通过实例详细对比了int32与sint32的编码差异,并给出了针对负数、大数及重复字段的实用选型建议,帮助开发者优化序列化性能与数据体积。

weixin_29219189的博客 227

Protobuf序列化原理

一、Protobuf序列化原理简介 1.1序列化 序列化是将数据结构或对象转换成二进制字节流的过程。 Protobuf对于不同的字段类型采用不同的编码方式和数据存储方式对消息字段进行序列化,以确保得到高效紧凑的数据压缩。 Protobuf序列化过程如下: (1)判断每个字段是否有设置值,有值才进行编码。 (2)根据字段标识号与数据类型将字段值通过不同的编码方式进行编码。 (3)将编码后的数据块按照...

钟离默的个人博客 9891

Varint+ZigZag编码和解码

如何对一个字节或多个字节的数据序列化并压缩

大橙子的博客 1459

为什么Protobuf选择Varint?从编码效率到实战案例分析

本文深入解析了Protobuf选择Varint编码的原因,从编码效率到实战案例分析。Varint作为可变长度整数编码方式,能根据数值大小动态调整存储空间,显著提升数据传输和存储效率。通过对比传统编码方式,展示了Varint在空间节省和性能优化上的优势,并探讨了其在RPC通信和数据库存储中的实际应用价值。

weixin_42535461的博客 330

深入解析Protobuf编码:从Varint到ZigZag的优化实践

本文深入解析了Protobuf的核心编码机制,重点阐述了Varint变长编码如何高效压缩小整数,以及ZigZag编码如何巧妙解决负数存储空间过大的难题。通过TLV结构、实战手算示例及Packed Repeated等高级优化实践,揭示了Protobuf实现极致空间效率与解析速度的设计哲学,为协议设计与性能优化提供了关键指导。

h0i1j2k3l的博客 730

TLV与Protobuf:从二进制编码到高效序列化的工程实践

数据序列化是分布式系统和数据交换的核心基础技术,其本质是将内存中的结构化数据转换为可存储或传输的字节流格式。其核心原理在于定义一套高效的编码规则,在发送方和接收方之间建立统一的数据理解契约。这项技术的核心价值在于实现跨平台、跨语言的数据可靠交互,并显著提升传输效率和降低带宽消耗。它广泛应用于微服务通信、配置文件存储、物联网设备数据传输以及高性能计算等场景。本文聚焦于两种广泛采用的方案:基础的TLV(Tag-Length-Value)编码与现代化的Protobuf(Protocol Buffers)框架,深入

weixin_33747129的博客 643

protobuf原理以及实例(Varint编码)

注意:每个字段的编号,需要按照顺序从1开始规则定义,最小编号是 1,最大的是 2^29 -1即536,870,911,其中 19000 到 19999不能使用(内定为Protocol Buffers使用)。其中Varint 编码最常用,可以看到int,bool,enum这类数据都使用的Varint 编码。从代码中可以看出来我们是从最低的7位开始处理的,通过移位指令一直处理到高位,直到剩余高位小于0x80,从代码逻辑可以看出这样的编码形式的优雅。为0表示这就是最后一个字节,不需要再读写一个字节了。

weixin_44477424的博客 846

利用Openlayers4实现地图遮罩效果(二)

之前实现的遮罩效果,在深色背景的底图上,对要突出的区域采用半透明遮罩,以此来突出该区域。但是有时底图颜色偏白,这时候不再适合对要突出的区域采用遮罩,而是要对突出区域之外进行遮罩处理。两种效果的对比入下图: ...

此爱如少年 6397

2025华东杯A/B/C题解题思路+可运行代码参考

这些因素包括但不限于:助滑坡的坡度、运动员的质量、滑雪板的接触面与雪地的摩擦力、空气阻力系数、运动员的体型和衣物形态等。助滑坡是运动员滑行至起跳台前的最后一段坡道,这一段坡道的坡度、长度和运动员的姿势会直接影响到起跳时的初始速度。运动员的滑行速度不仅受助滑坡的坡度影响,还受到摩擦力、空气阻力和重力等多方面因素的影响。通过合理的姿势调整,运动员能够有效减少空气阻力,增加身体的重力加速度,进而提升滑行速度。助滑坡的角度通常介于10°到12°之间,而运动员的滑行速度将受到重力、摩擦力和空气阻力的共同作用。

qq_52590045的博客 1796

Grafana Mimir 依赖剖析:dennwc/varint 高性能 Protobuf Varint 编解码原理与实战

本文深入剖析 Grafana Mimir 仓库中第三方依赖 `github.com/dennwc/varint`(v1.0.0):一个零依赖、针对 protobuf varint 编码/解码深度优化的 Go 库。Mimir 的 TSDB 索引头(index header)解析与 store-gateway 的 postings 编解码大量调用该库,它是查询热路径上被高频执行的基础组件。读完本文,你

gitblog_00599的博客 892

【Unity】【模型】【AI建模】如何将AI生成的GLB格式3D模型文件导入Unity

本文介绍了一个将AI工具自动生成的GLB格式3D模型文件转换成fbx模型文件导入Unity的步骤。

O青草O的博客 Unity和游戏制作知识分享 1357

varint原理 - 负数的编码和解码

varint编码负数

papaya的博客 682

GNSS差分码偏差(DCB)从原理到实战:如何避免数据处理中的常见错误

本文深入解析GNSS差分码偏差(DCB)的原理及其对高精度定位的关键影响。针对数据处理中因忽略DCB校正导致的常见错误,如单系统PPP高程偏差、多系统融合精度下降及电离层研究失真等,提供了实战解决方案与主流DCB产品获取、集成方法,帮助用户有效规避陷阱,提升数据处理精度。

k5l6m的博客 223

对halcon形状匹配算法的一点分析

基于Intel VTune Profiler对halcon形状匹配算法的一点分析

manuoo的专栏 566

Protobuf编码原理及优化技巧探讨

将某个struct或class的内存数据和通信数据链路上的字节流进行互相转化的算法。基于这个定义序列化算法具有两个行为:1、序列化:内存数据->通信链路字节流2、反序列化:通信链路字节流->内存数据常用的序列化算法有:json、xml、protobuf 等,将这些算法进行归纳不难发现这些算法主要是对三种基本类型(原子性、不可被拆分)和三种复合类型(由基本类型和其他符合类型构成)进行序列化和反序列化。1、基本类型:定点数值类型、浮点数值类型、字符串类型2、复合类型:结构体类型、数组类型、map类型。

Code365 1693

解锁VS2022!手把手教你本地部署Deepseek

在 VS2022 中本地部署 Deepseek,我们首先需要确保硬件资源的充足,如高性能的 GPU、大容量内存和高速存储等,这是模型稳定运行的基石。如果生成的摘要能够准确概括原文的核心内容,就表明 Deepseek 模型在文本分析方面的功能正常,部署稳定可靠。这对于开发者来说,能够大大提高开发效率,当遇到一些常见的功能实现时,可以借助 Deepseek 模型快速生成基础代码框架,减少手动编写的工作量。在大语言模型的蓬勃发展的当下,Deepseek 凭借其卓越的性能和创新的技术,已然成为该领域的佼佼者。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1万+

Protobuf 编码结构

protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,可用于数据通信协议和数据存储等,它是 Google 提供的一个具有高效协议数据交换格式工具库,是一种灵活、高效和自动化机制的结构数据序列化方法。相比XML,有编码后体积更小,编解码速度更快的优势;相比于 Json,Protobuf 有更高的转化效率。

谢谢大家的关注 1413

全国区块链职业技能大赛国赛考题前端功能开发

全国区块链职业技能大赛国赛考题区块链应用前端功能开发

本郡主是喵 1333

Onnxruntime之YOLOP部署过程记录

魔改YoloP部署过程记录

如果想成为中心,那么就到中心去吧。 1924

Protobuf底层编码深度拆解:Varint压缩、嵌套消息序列化、字段兼容,手写极简Protobuf编解码器

文章摘要 本文深入解析Protobuf底层编码机制,重点剖析Varint压缩、TLV结构和字段兼容设计。与JSON等自描述格式不同,Protobuf采用契约化编码,通过.proto文件预先约定数据结构,二进制流中仅存储紧凑的Tag-Length-Value三元组。核心创新包括:1) Varint变长整数编码,利用MSB位实现1-10字节自适应压缩;2) TLV通用存储结构,将字段编号与线类型打包成Tag;3) 小端序字节排列优化解码效率。实测显示Protobuf体积比JSON小60%以上,吞吐量提升5.6倍

网络工程师|十多年企业级运维实战|精通 ‌BGP、OSPF、VLAN、SDN、MPLS、ACL、NetFlow、SNMP、 511

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

protobuf 中使用的Varint技术

Varint 是一种紧凑的表示数字的方法。它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。 比如对于 int32 类型的数字,一般需要 4 个 byte 来表示。但是采用 Varint,对于很小的 int32 类型的数字,则可以用 1 个 byte 来表示。当然凡事都有好的也有不好的一面,采用 Varint 表示法,大的数字则需要 5 个 byte 来...

weixin_40021744的博客 2290

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

深入 ProtoBuf - 编码

深入 ProtoBuf - 编码

whl0071的专栏 1509

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Protobuf序列化机制的核心原理

Protobuf的核心原理是通过预定义Schema和使用TLV二进制编码实现高效序列化。其要求开发者通过.proto文件明确定义数据结构,利用字段编号而非字段名进行二进制编码,采用Tag-Length-Value格式存储数据。这种机制具有体积小、速度快、跨语言支持等优势,同时通过字段编号机制保证向后兼容性。相比JSON和XML,Protobuf在性能和存储效率上表现更优,特别适合分布式系统通信。

技术人集结地 1706

突破性能瓶颈:Protobuf二进制编码核心原理与实战优化

你是否曾遇到过API传输延迟居高不下?或者日志文件体积庞大难以存储?作为数据交换的"隐形功臣",Protocol Buffers(简称Protobuf)的二进制编码格式(Wire Format)正是解决这些问题的关键技术。本文将带你深入理解这种高效编码格式的底层逻辑,掌握字段标签设计、ZigZag编码等核心技术,最终实现数据传输量减少40%的实战优化。 ## 解码Protobuf的高效密码:Wi...

gitblog_00273的博客 904
上一篇: C# 谁是短字符串拼接之王
下一篇: Unity Editor实现一个比AssetDatabase.FindAssets内存和CPU都更友好的替代方案
ZZHSourceCode
博客等级 码龄9年 8粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值