首页 > 其他分享 >【专栏精选】网络封包神器protobuf简介

【专栏精选】网络封包神器protobuf简介

时间:2023-04-28 16:39:34浏览次数:44  
标签:XML 数据结构 封包 protobuf proto 神器 JSON 序列化


本文节选自洪流学堂公众号技术专栏《大话Unity2019》,未经允许不可转载。

洪流学堂公众号回复专栏,查看更多专栏文章。


洪流学堂,让你快人几步。你好,我是郑洪智。

大智:“上次我们在学习如何进行数据包封包的时候说到:在网络传输时数据包需要定义好格式,这个格式就是数据在字节流中是如何排列的,有时候这种数据排列的方式也称作协议(Protocol)。自定义协议灵活性很大,但是相应的复杂度也很高,如果客户端和服务器是两种不同的语言开发的,就需要分别进行协议的编码和解码,工作量会很大。不过,还有一个Protocol Buffers可以解救我们。”

【专栏精选】网络封包神器protobuf简介_JSON

Protocol Buffers

Protocol Buffers (通常简称为protobuf) 是Google开发的一种格式,这种格式与开发语言无关、与运行平台无关,用于序列化结构数据,并且很容易扩展。这种格式可以用于通信协议、数据存储等等。你可以想一下之前学过的xml或json,和他们有些类似,但是protobuf更小、更快、更简单。

protobuf是开源的,地址如下:https://github.com/protocolbuffers/protobuf

使用protobuf时,你只需要按照protobuf的格式要求将数据结构定义在.proto文件中一次,就可以通过protobuf的编译工具生成不同开发语言的数据结构代码(就像我们在C#中序列化/反序列化xml或json时需要定义的class类),生成的代码中还封装了数据结构的读写和序列化。

为什么要用protobuf呢?

举个简单的地址簿的例子,从文件读写联系人的信息。每一个联系人有姓名、ID、email和电话。

如果使用你已经学过的知识,如何序列化和反序列化这样的数据呢?有几种方式可以实现:
1、第一种,使用我们之前学过的XML或JSON。XML和JSON的好处就是它们具有自描述性,是人类可读的,几乎所有编程语言都有成熟的开源库来序列化/反序列化它们。如果你想要和其他程序进行数据交换,XML/JSON是很好的选择。但是,XML/JSON数据所占的空间比较大(因为有很多冗余的标签、字符),同时解析速度比较慢。后面我们会具体比较XML/JSON和protobuf的区别。

2、第二种,使用.NET的二进制序列化类:System.Runtime.Serialization.Formatters.Binary.BinaryFormatter。用这种方式,一旦改变数据结构会非常麻烦,之前已有的数据可能都无法使用了,并且与其他程序进行数据交换时很麻烦。

3、第三种,使用自定义的数据格式,比如上次我们学习到的格式。这种方式简单、快速,但是不方便的就是如果在多种语言之间传输,每种语言都要写解码、编码的代码。

protocol buffers正是google开发来解决上面提到的这些问题的。protobuf拥有灵活性、高效率、自动化的特性。使用protobuf时,你只需要写一个.proto的数据结构描述文件,protobuf提供的编译器就可以自动将.proto文件编译成你想要的编程语言的代码,这些自动生成的代码里实现了编码、解码、读写这些格式数据的功能。更重要的是,protobuf格式支持后续扩展,扩展后的格式仍然可以兼容旧格式。

详细对比XML/JSON

上面我们多次提到了XML/JSON,它们有类似的地方,但是也有很多不同。

相对于XML或JSON,Protocol buffers有许多优点:
** 序列化出来的数据更精炼
** 序列化出来的字节数缩小3-10倍
** 序列化的性能快20-100倍
** 数据歧义更少
** 可以自动生成用于访问数据结构的代码

但同样,有一些情况下proto不如XML或JSON:
** XML/JSON拥有人类可读性、可编辑性,但是protobuf不可以(至少原生protobuf序列化的数据不可以)
** XML/JSON有自描述性,但是proto的数据没有意义,除非你能拿到定义文件(.proto)

所以通常protobuf更适合使用在对数据字节数比较敏感的场景,对序列化/反序列化性能要求高的场景。比如游戏开发这种高并发、数据包的频次非常高、手游对流量敏感就是一个很适合的场景。

protobuf的工作流

protobuf有两个版本,分别是proto2和proto3,后面我们学习的时候使用的都是新版的proto3,如果你后续在查找资料时发现不相同的地方,一定要确认下是哪个版本。

1. 定义.proto文件

首先你入要在.ptoto文件中定义你想要传输的数据结构。.proto文件很简单:使用message来定义每一个需要序列化的数据结构,每个message里面可以定义类型和名称。

2. 编译.proto文件

使用protobuf提供的编译工具,将.proto文件编译为对应开发语言的数据结构代码。

3. 在代码中序列化和解析

在代码中将数据结构序列化成字节数组发送出去,或者将接收到的字节数组反序列化成内存中的数据。

总结

大智:“具体详细的.proto文件如何编写,后面我们一起详细探索。”

思考题

大智:“把之前的聊天系统的消息写成一个proto文件试试。”
小新:“好嘞!”
大智:“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”


洪流学堂公众号回复专栏,查看更多专栏文章。

《大话Unity2019》,大智带小新学Unity2019的有趣经历,让你学Unity更简单。




标签:XML,数据结构,封包,protobuf,proto,神器,JSON,序列化
From: https://blog.51cto.com/u_5746184/6234780

相关文章

  • Web开发神器,最智能的Javascript IDE——WebStorm
    我的开发很大一部分是和Javascript打交道,很久以来,我一直在Spket、Aptana、VisualStudio、IntelliJIDEA、notepad++、vim等选择中徘徊,因为发现他们都很好,但都缺少我想要的……直到我开始使用WebStorm。 什么是我对JavascriptIDE选择的标准?1、快速智能的代码提示(全项目的)和补全2......
  • 推荐两个AI神器:ChatGPT只需1个标题,2分钟全自动生成PPT!
    今天给大家分享两个工具,帮助你全自动生成PPT,接下来以自动化测试为主题,教大家如何2分钟生成好PPT。1、第一个工具:ChatGPT1、打开ChatGPT页面,输入prompt,告诉它,让它帮你生成一份自动化测试为主题的PPT,如:帮我生成一个自动化测试为主题的PPT,内容不少于10页,用markdown格式生成2、......
  • 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(15)-Charles如何配置反向代理
    1.简介在App开发的过程当中,抓包是一个很常见的需求,而有些app的请求不会在网络设置代理时被抓到数据包,这里若是需要抓包就需要搭建反向代理。2.什么是代理?什么是代理,来一张图了解一下。 代理又分为正向代理和反向代理。3.什么是正向代理?先来看张图~【再举个栗子】某同......
  • [protobuf] 0值不显示
    在protobuf中,如果一个字段的值为默认值(例如数字类型为0、字符串类型为""、枚举类型为第一个枚举值),并且该字段未被设置,那么默认值将不会被序列化成对应的二进制数据,也就是不会被显示。这是因为protobuf默认会优化掉这些默认字段,从而减小序列化后数据的大小。如果需要显示这些默认......
  • OpenAI的子词标记化神器--tiktoken 以及 .NET 支持库SharpToken
    经过Tokenize之后,一串文本就变成了一串整数组成的向量。OpenAI的 Tiktoken 是更高级的Tokenizer,编码效率更高、支持更大的词汇表、计算性能也更高。OpenAI在其官方GitHub上公开了一个开源Python库:tiktoken,这个库主要是用力做字节编码对的。字节编码对(BytePairEncoder......
  • 人人都在偷偷用的神器!别错过推特视频下载的超简单方法~
    有没有铁子们常常在推特上看到一些超有趣的视频,想要保存下来但是却不知道该怎么保存呢?今天我告诉你们直接保存到手机相册的终极方案,毫不费劲!真的很简单,不服来战!而且绝对真实有效!步骤详解:①先打开推特,选择一个视频,点【分享】按钮复制链接②再打开【光影存图】app(安卓和苹果手机在手......
  • 程序猿偷懒神器之搜狗输入法-保姆级教程
    因为我个人用搜狗输入法比较多,所以发现了一些搜狗输入法的快捷方式也是比较偷懒的。知道的略过,不知道的可以简单看一下。首先比较程序员查询数据库的句子比如 selecttop1*from  再比如 select*from  再比如 delete from 等等这些句子每天不知道需要打多少......
  • Prometheus + Grafana,开源监控神器!
    1Prometheus介绍 Prometheus是一个开源系统监控和警报工具包,用于收集和聚合指标作为时间序列数据,即将指标信息、记录的时间戳以及称为标签的可选键值对一起存储,详细介绍请查看官方文档 2Prometheus及其组件安装因Prometheus组件基本都是用Go编写的,所以更易于构建和部署,解压......
  • K8s 日志高效查看神器,提升运维效率10倍!
    通常情况下,在部署了 K8S 服务之后,为了更好地监控服务的运行情况,都会接入对应的日志系统来进行检测和分析,比如常见的 Filebeat+ElasticSearch+Kibana 这一套组合来完成。虽然该组合可以满足我们对于服务监控的要求,但是如果只是部署一个内部单服务用的话,未免显得大材小用,而且......
  • SpringBoot Kotlin 集成和使用 Protobuf
    环境版本不同的环境配置参数可能区别较大,请酌情参考。插件或依赖版本号SpringBoot2.7.10Gradle7.5.1ProtobufGradlePlugin0.9.2ProtobufJava3.21.9Protoc3.21.9Grpc1.53.0项目是使用IDEA创建的SpringWeb项目,语言Kotlin,构建GradlePr......