protobufjs在微信小游戏环境中运行出错,一时让不少人被此问题卡住,做为pbkiller的开发者,必须将些问题了解清楚,目前提供下面几个方案:
我曾在公众号上发过一篇《微信小游戏protobuf.js快速解决办法》,在这里给大家说声不好意思,这篇文章中的proto加载方案存在缺陷,具体问题如下图所示: ? 一、protobuf.js加载源码分析 还是从protobuf.js源码入手,我增加了一些注释,方便理解: ProtoBuf.loadProtoFile = function(filename, callback 微信小游戏环境我的理解是:阉割+定制过的浏览器,它没有提供XMLHttpRequest API,这是导致protobuf.js失败的原因。 cc.loader.loadResDir('pb', (error, data) => { //通知调用都,预加载完毕 cb(); }); } 简单几行代码解决了所有问题,而且没有修改protobuf.js 四、结束 pbkiller的内核是protobuf.js,我所做的工作只是将protobuf.js适配到Cocos-JSB和微信小游戏环境,让其能正常工作。
protobuf.js是一个纯JavaScript实现,支持Node.js和浏览器的TypeScript,它容易使用速度快速,可以直接反射.proto文件,不需要生成任何文件。 protobuf.js是基于ByteBuffer.js的Protocol Buffers纯JavaScript实现,主要功能是解析.proto文件,构建Message类,编码解码。 安装 下载安装protobufjs https://github.com/protobufjs/protobuf.js 查看protobufjs候选版本 $ npm view protobufjs versions 使用NPM全局安装protobufjs $ npm i -g protobufjs protobuf.js 依赖 long.js、bytebuffer.js 创建.proto文件 $ vim msg.proto $ pbjs protobuf.js v6.7.0 CLI for JavaScript 在文件格式之间转换并生成静态代码 -t, --target 指定目标格式,可以接受需要自定义目标的路径。
2 插件模式遇到的坑 还好的是 protobufjs 支持插件模式,分别 protobufjs 的三个核心文件: protobuf.js bytebuffer.js long.js 在 Creator 打开调试,发现合并的 protobuf.js 三个模块又走到 CommonJS 的加载流程中去了。 ?
经过调研,目前前端使用pb主要有两种方式,一个是google官方推出的protobuf for js,另一个是开源社区的protobuf.js。 protobuf.js的massage类型对象还有很多方法,可以去文档里查看。 到了这里,我们了解了两个库的简单使用方法,应对一般的需求是够了,这时候你可能会觉得,很简单嘛,这有什么难的! 先用protobuf.js的方法解析 ? 转换后的resObj是空的,实际上却是有值的,为什么呢,因为response不是二进制,不能直接被解析。那么jquery能解析二进制吗? 好,到这里,采用protobuf.js方案的ajax已经能够成功使用pb流了,接下来我们再试一下google-protobuf ajax不变 // 先使用protoc 根据 share.proto 生成 所以很尴尬,能上传数据,但是接收到的数据无法解析,最终我放弃了使用google官方的库,选择了protobuf.js 总结 这次采坑之路,足足花了我1个星期时间,英语本来就差的我,啃起文档来还是挺吃力的
实际上在使用JavaScript进行PB通信时,我会使用ProtoBuf.js这个库帮我处理pb到json的类型转换,而ProtoBuf.js本身是依赖了一个工具库 long.js 来对 int64 和 longValueToB = Long.fromString(longValue, true); 参考资料 《你不知道的JavaScript(中卷)》 ProtoBuf.js 使用技巧
实际上在使用JavaScript进行PB通信时,我会使用ProtoBuf.js这个库帮我处理pb到json的类型转换,而ProtoBuf.js本身是依赖了一个工具库 long.js 来对 int64 和 longValueToB = Long.fromString(longValue, true); 参考资料 《你不知道的JavaScript(中卷)》 ProtoBuf.js 使用技巧
实际上在使用JavaScript进行PB通信时,我会使用ProtoBuf.js这个库帮我处理pb到json的类型转换,而ProtoBuf.js本身是依赖了一个工具库 long.js 来对 int64 和 longValueToB = Long.fromString(longValue, true); 参考资料 《你不知道的JavaScript(中卷)》 ProtoBuf.js 使用技巧 广告时间
本文作者:IMWeb link 原文出处:IMWeb社区 未经同意,禁止转载 这篇文章的代码都是基于Protobuf.js 4.x的API写的,已经跟最新的Protobuf.js 6.x不兼容了 在NodeJS中实践Protocol Buffer协议 选择支持protobuf的NodeJS第三方模块 protobuf.js ? Google protobuf js ? 根据star数和文档完善程度两方面综合考虑,我们决定选择protobuf.js一个栗子 ? 我打算使用 Protobuf 和NodeJS开发一个十分简单的例子程序。 该程序由两部分组成。 编译 .proto 文件 我们可以使用protobuf.js提供的命令行工具来编译 .proto 文件 用法: # pbjs <filename> [options] [> outFile] 我们来看看
本文作者:IMWeb link 原文出处:IMWeb社区 未经同意,禁止转载 这篇文章的代码都是基于Protobuf.js 4.x的API写的,已经跟最新的Protobuf.js 6.x不兼容了 在NodeJS中实践Protocol Buffer协议 选择支持protobuf的NodeJS第三方模块 protobuf.js Google protobuf js protocol-buffers 根据star数和文档完善程度两方面综合考虑,我们决定选择protobuf.js一个栗子 我打算使用 Protobuf 和NodeJS开发一个十分简单的例子程序。 编译 .proto 文件 我们可以使用protobuf.js提供的命令行工具来编译 .proto 文件 用法: # pbjs <filename> [options] [> outFile] 我们来看看
相对于JSON来说,编码解码的步骤比较繁琐,但是,protobuf 比 JSON 快 https://github.com/dcodeIO/protobuf.js/blob/master/README.md 无论是编码解码还是结合的过程( protobuf 从对象编码为二进制,从二进制数据解码为对象 JSON 通过JSON.stringify从对象编码为字符串,JSON 通过JSON.parse从字符串解为对象) protobuf.js
配置该gRPC任务时,插件在前端接收gRPC服务入口点、gRPC的protobuf服务定义、请求用消息和SSL等参数,并在保存时将protobuf经protobuf.js编译为特定描述传递到后端。 在这个插件中我使用了protobuf.js作为编译器,将protobuf在前端提前进行编译,任务数据同时保存protobuf源代码和中间描述,在后端根据中间描述直接构建二进制格式,接触了对protoc的依赖
使用protobuf.js实现JSON与Protobuf类型映射。2.2.后端创建gRPCTask相关基础代码,实现超时重试等功能。解析前端传入的参数,支持动态生成gRPC调用。
我们没有使用 protobuf.js[4],它也使用 node 实现了 gRPC 协议,同时在我看来这个 gRPC 库更灵活,可以拦截请求,完成一些比如 json 解析器等比较好用的事情,但是官方项目的 grpc-node/tree/master/packages/proto-loader [3] https://github.com/grpc/grpc/blob/master/doc/naming.md [4] protobuf.js : https://github.com/protobufjs/protobuf.js [5] grpc-node: https://github.com/grpc/grpc-node [6] node-grpc-interceptors
领略模块化的力量》 《CreatorPrimer|组件编码心得(上、中、下)》 一本正经假装很有经验系列: 《Cocos论坛九问九答》 《游戏开发心悟》 《CocosCreator发展趋势与感悟》 《微信小游戏protobuf.js
exports']},compress: { drop_console: true, pure_funcs: ['console.log']}}二进制文件处理将JSON转为二进制格式(需配套解析代码)使用protobuf.js
数据逆向实战 7、娱乐产业数分平台变异 AES 数据逆向实战 Day 2: 1、详解 Octet-Stream 流数据的产生原理 2、详解 Octet-Stream 源数据的生成规则与解析方式 3、详解 protobuf.js
分析 ---- 从错误提示上看,是protobuf.js内部在解析ChatMsg中的playerInfo时出错,我们看一下,ChatMsg的定义: ?
5、选择支持protobuf的NodeJS第三方模块当前在Github上比较热门的支持protobuf的NodeJS第三方模块有如下3个:根据star数和文档完善程度两方面综合考虑,我们决定选择protobuf.js 6.3 编译 .proto 文件我们可以使用protobuf.js提供的命令行工具来编译 .proto 文件。
protobuffer.js - 我们可以使用这个库来解析 protobuf.js 提供了几种方式来处理proto。