在网络通信和一般数据交换等应用场景中经常用到的技术是JSON或XML和Google的Protobuf。Protobuf是后起之秀,在效率和兼容性方面更胜一筹。很多人在项目技术选择上应该优先考虑Protobuf,尤其是在网络通信、通用数据交换等场景。EgretEngine首席架构师王泽曾发布过一个开源项目Protobuf-egret,提供了一个可以适配微信小游戏的Protobuf类库和相应的代码生成工具,而且这个工具并不局限于EgretEngine,即使它使用其他HTML5游戏引擎的开发者也可以使用它。本文将从基础开始讲解,让大家了解Protobuf以及如何在自己的项目中使用Protobuf的数据格式以及开源项目Protobuf-egret开源库的使用。1.什么是Protobuf?Protobuf是一种类似于Json和XML的开源Google数据交换格式。其内部数据为纯二进制格式,不依赖于语言和平台。具有简单、数据量小、速度快等优点。二、Protobuf及XML与Json的比较1、json:一般的web项目中,json是最受欢迎的。因为浏览器对json数据支持的很好,所以内置了很多函数支持。2.XML:在webservice中应用最广泛,但与json相比,由于需要成对的结束标签,其数据冗余度更高。JSON使用键值对,既压缩了一定的数据空间,又具有可读性。3.Protobuf:是Google开源的一种数据格式,适用于对性能和响应速度有要求的数据传输场景。与其他Protobuf相比,优势更多1:序列化后的体积比json和XML小,适合网络传输2:支持跨平台多语言3:消息格式升级和兼容性还不错4:序列化和反序列化速度很快快,比Json的处理速度快结论:在需要传输大量数据的场景下,如果数据量很大,那么选择Protobuf可以显着减少数据量和网络IO,从而减少网络传输消耗的时间。3.如何使用Protobuf因为profobuf是二进制数据格式,需要进行编码和解码。数据本身不可读。因此反序列化后只能得到真正可读的数据。那么,在项目中如何使用呢?首先编写一个Protobuf格式的消息文件(后缀为.proto的文件);下面是我写的一个test.proto文件syntax="proto3";//语法是proto3packagetest的语法;//为每个文件指定一个package值。//每个数据结构都是一条消息,消息关键字定义messageuser_login{//limitedmodifier|数据类型|字段名=|字段编码值|[字段默认值]requiredint32userId=1;必需的字符串userName=2;requirestringpassword=3;}ps:更多的语法规则可以百度查,这里就不详细解释了。其次,使用Protobuf编译器编译消息文件XXX.proto;google提供多种语言的实现:C++、C#、Objective-C、Java、JavaScript、Ruby、PHP、Dart、Go语言,每种实现都包含对应语言的Compiler和文档。最后,使用编译后的对应语言的类文件对消息进行序列化和反序列化。4、如何将Protobuf与egret集成如何在egret游戏项目中使用Protobuf数据格式进行网络通信和数据交换?EgretEngine首席架构师王泽曾发布过一个开源项目Protobuf-egret,提供了一个可以适配微信小游戏的Protobuf类库和相应的代码生成工具,而且这个工具并不局限于EgretEngine,即使它使用其他HTML5游戏引擎的开发者也可以使用它。相关内容大家可以重新阅读《如何在微信小游戏中使用Protobuf》(https://mp.weixin.qq.com/s/WNdIRxZEfpKFpUdFdlr5Mg)。接下来,我将更详细地介绍我的使用过程。4.1引入egretProtobuf库特性提供Protobuf.js基础运行时库提供命令行脚本,从protofile生成JavaScript代码并生成正确的.d.ts代码,让TypeScript项目无需开发人员即可使用egret引擎配置文件一键配置您可以通过手动修改配置直接集成到项目中。这个项目虽然叫egretProtobuf,但是理论上支持所有的HTML5游戏引擎。欢迎PIXI.js、Cocos2d-js、LayaAir等引擎开发者使用本库。原理封装了Protobufjs库和命令行。使用Protobufjs6.8.4的运行时库。Protobufjs本身有pbts命令。虽然它也可以生成.d.ts文件,但是在全局模式而不是ES6模块的情况下会出现一些错误。本项目致力于解决这个问题,让Protobufjs可以用在非ES6模块的项目中(比如EgretEngine中也可以使用Protobufjs。Protobufjs提供了多种使用方式。由于微信小游戏禁止动态代码eval、newFunction等形式,本项目只提供生成代码的形式,不支持使用Protobuf.load('awesome.proto')(因为该方法同样无法在微信小游戏中运行).4.2安装egretProtobuf库第一步,首先检查你是否安装了node.js和npm,如果没有安装,请自行安装第二步,在你的电脑上安装Protobufjs库和egretProtobuf库。.js是基于ByteBuffer.js的ProtocolBuffers的纯JavaScript实现,主要功能是解析.proto文件,构造Message类,编解码。#安装Protobufjs库npminstallProtobufjs@6.8.4-g#安装egretProtobuf库npminstall@egret/Protobuf-g4.3使用egretProtobuf库假设用户有一个名为egret-project的egret项目;第一步,在egret-project目录下cd到cdegret-project。第二步,复制egretProtobuf代码和项目结构到egret项目中。.第四步,由peorobuf/bundles目录下的XXX.proto文件生成对应的js文件和d.ts文件。pb-egretgenerate4.4认识Protobuf-bundles.d.ts看看Protobuf如何序列化和反序列化Main.tsvaruser={"userId":1,"userName":"psyche"}//验证user是否是满足要求varret=test.user_login.verify(user);控制台日志(ret);//如果正确则ret为null,否则返回stringif(ret){throwError(ret);}varmsg=test.user_login.create(user);控制台日志(消息);//将实例编译成二进制流varbuf=test.user_login.encode(user).finish();控制台日志(buf);//解析二进制流varde_buf=test.user_login.decode(buf);控制台日志(de_buf);关于egret中Protobuf的使用介绍到此结束,案例见链接:https://github.com/WQQPsyche/..。
