一、介绍
API文档:https://www.npmjs.com/package/protobufjs
ProtoBuf.js是基于ByteBuffer.js的Protocol Buffers纯Javascript实现。主要功能是解析.proto 文件,构建message类,和简单的编码、解码。
二、优势
同为数据的存储格式,和json相比,Protocol Buffers的优点主要体现在性能和体积上,性能方面需要实际的测试,暂且不说,数据体积方面的优势是比较明显的,例如,一个json文件:
[
{"Name": "zhangsan", "Gender": 0, "Age": 18},
{"Name": "lisi", "Gender": 1, "Age": 19}
]
再看一个protobuf文件:
message Person {
required string Name = 1;
optional int32 Gender = 2;
optional int32 Age = 3;
}
三、安装
npm安装地址:https://www.npmjs.com/package/protobufjs
npm install protobufjs [--save --save-prefix=~]
CDN方式:
<script type="text/javascript" src="./protobuf.js"></script>
四、使用
1、Load 加载(默认是相对路径引入.json文件)
var locProto,
protobuf.load(BASE_ASSET_ROOT_URL+'/test.json', function(err, root) {
locProto = root.lookupType("Loc.flight");
locProto.decode(`Uint8Array格式数据`); // 或 locProto.decode(new Uint8Array(buffer))
});
2、fromJSON加载
var jsonDescriptor = require("./test.json");
var root = protobuf.Root.fromJSON(jsonDescriptor);
var locProto = root.lookupType("Loc.flight");
3、通过命令行生成test.json
> npm install protobufjs-cli --save-dev
> pbjs -t json test.proto > test.json
五、修改protobuf.js里的fetch函数,使之可以域方式加载
搜索关键字
function fetch(filename, weak) { // ...
找到 fetch(self.resolvePath("", filename));
添加如下判断
if(!/^http/.test(filename)) {
if (util.isString(filename))
filename = [ filename ];
filename.forEach(function(filename) {
fetch(self.resolvePath("", filename));
});
} else {
fetch(filename);
}
示例:
protobuf.load('http://www.xxx.com/vendor/flightloc.json', function(err, root) {
locProto = root.lookupType("Loc.SubscribeFlightLoc");
});
参考链接