本文节选自洪流学堂公众号技术专栏《大话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

【专栏精选】网络封包神器protobuf简介相关推荐

  1. iOS开发工具——网络封包分析工具Charles

    iOS开发工具--网络封包分析工具Charles 简介 Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析.Char ...

  2. 【Android Protobuf 序列化】Protobuf 简介 ( Protobuf 项目简介 | Protobuf 优缺点分析 )

    文章目录 一.Protobuf 简介 二.Protobuf 优缺点分析 1.Protobuf 优点 2.Protobuf 缺点 三.参考资料 一.Protobuf 简介 Protobuf 是 Goog ...

  3. iOS开发工具-网络封包分析工具Charles

    简介 本文为InfoQ中文站特供稿件,首发地址为:文章链接.如需转载,请与InfoQ中文站联系. Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯 ...

  4. 网络封包分析工具Charles(接口抓取)

    目录 本文的内容主要包括: Charles 的简介 如何安装 Charles 将 Charles 设置成系统代理 Charles 主界面介绍 过滤网络请求 截取 iPhone 上的网络封包 截取 Ht ...

  5. Protobuf—简介,优缺点

    protobuf 是Google旗下的一款平台无关.语言无关,可扩展的序列化结构数据格式.所以很适合用做数据存储和作为不同应用.不同语言之间相互通信的数据交换格式,只要实现相同的协议格式的统一prot ...

  6. 网络封包分析工具Charles

    iOS环境必备的测试工具--网络封包分析工具Charles 简介 Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析 ...

  7. Charles — mac下网络封包分析工具

    简介 Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析.Charles通过将自己设置成系统的网络访问代理服务器,使 ...

  8. iOS安全- 网络封包分析工具Charles

    之前写了一篇文章: iOS开发- 以图搜图功能实现 (源码+解析) 好多朋友都比较好奇我是如何获取到百度以图搜图的API, 其实这非常简单. 利用网络封包分析工具 " Charles &qu ...

  9. Wireshark网络封包分析

    一.Wireshark简介 Wireshark是一个网络封包分析软件.网络封包分析软件的功能是截取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口(现在普遍 ...

最新文章

  1. 阮一峰老师的ES6入门:async 函数
  2. jedis使用_网易架构师心得:Springboot下使用redis踩过的坑
  3. 致命错误:没有用于主机192.168.1.112,用户postgres
  4. 如何在SAP云平台ABAP编程环境里把CDS view暴露成OData服务
  5. 收集的安装VS2005 sp1的注意事项
  6. perl学习之:函数总结
  7. [转]浅谈 python multiprocessing(多进程)下如何共享变量
  8. 深度学习之浅谈全连接层
  9. python实例31[My Stock Info]
  10. 怎样使用OUTLOOK收发邮件   小雨
  11. Python中的X[:,0]和X[:,1]
  12. android ble 写失败,Android低功耗蓝牙BLE写入数据很大几率会失败 求解
  13. Git拉代码(https以及ssh两种)
  14. oracle kup04040,ORA-20011 ORA-29913 and ORA-29400错误的说明
  15. html用户名和用户密码验证,js实现用户名和密码的校验
  16. gitlab上fork别人的代码,如何更新主分支最新代码
  17. 服务器虚拟内存会导致卡顿吗,win7设置虚拟内存后导致电脑卡怎么办
  18. C# 简单判断枚举值是否被定义
  19. 三菱,实现面向家庭剧院的液晶投影仪
  20. 模型量化论文阅读#2----BRECQ: PUSHING THE LIMIT OF POST-TRAINING QUANTIZATION BY BLOCK RECONSTRUCTION

热门文章

  1. 使用.net framework再发布的插件发布应用程序
  2. 分步骤演示如何使用Filter链拦截MyServlet的同一个请求
  3. 编译是检查c语言,为什么CMake检查C编译器?
  4. 闭包函数 python_python 函数,闭包
  5. linnux 流量控制模块tc_FS4008-40-08-CV-A气体质量流量计【汉川仪器】阿坝资讯
  6. 惠普服务器eth0的位置,HPUX下定位网卡位置
  7. android 动态创建view,react-native动态创建Android View 无效果
  8. 客户和顾客是一个意思吗_“啤酒度数”和“啤酒酒精度”一个意思吗?
  9. 帮助您快速开始下一个移动APP应用模板、UI设计
  10. 让版面充满空间感的海报PSD分层模板,你一定要看看!