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

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

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


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

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

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更简单。

https://edu.hongliu.cc

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容