ProtoBuf.js – Protocol Buffers的Javascript实现(转)
Posted 可爱的小熊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ProtoBuf.js – Protocol Buffers的Javascript实现(转)相关的知识,希望对你有一定的参考价值。
原文链接:ProtoBuf.js – Protocol Buffers的Javascript实现
推荐前端网址:http://keenwon.com/
在javascript里比较常见的数据格式就是json,xml,但是这两种格式在数据传输方面有明显不足。而Protocol Buffers可以很好的解决这个问题,下面引用百科的对Protocol Buffers的定义:
Protocol Buffers是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。它不依赖于语言和平台并且可扩展性极强。现阶段官方支持C++、JAVA、Python等三种编程语言,但可以找到大量的几乎涵盖所有语言的第三方拓展包。
同为数据的存储格式,和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;
- }
json文件的问题在于无效数据太多,例如Name
和Gender
等,这些内容大量重复出现,使得数据体积较大。再看protobuf文件,它使用一个唯一的id(数字)来代替json里复杂的key,这样只要数据发送方和接受方都按同一套“模板”解析数据,就可以大大缩短报文体积。
ProtoBuf.js
ProtoBuf.js是基于ByteBuffer.js的Protocol Buffers纯Javascript实现。主要功能是解析.proto
文件,构建message类,和简单的编码、解码。目前我在一个node-webkit中使用protobuf格式于服务端进行数据交互(服务端是按照旧c++客户端要求实现的protobuf)。
目前对ProtoBuf.js的使用主要就是读取旧的.proto
文件,创建message类,编码,发送给服务端,如下:
user.proto
文件:
- package protobuf;
- message UserModel {
- required string cyUserno = 1;
- required string cyPassWord = 2;
- required string cyStatus = 3;
- }
nodejs代码:
- var fs = require("fs"),
- ProtoBuf = require("protobufjs"),
- userProtoStr = fs.readFileSync(‘./user.proto‘).toString(),
- UserModel = ProtoBuf.loadProto(userProtoStr).build(‘protobuf‘).UserModel,
- userModel;
- userModel= new UserModel();
- userModel.set(‘cyUserno‘, ‘111111‘);
- userModel.set(‘cyPassWord‘, ‘123456‘);
- userModel.set(‘cyStatus‘, ‘1‘);
- var buffer = userModel.encode().toBuffer();
解码的方法也很简单:
- var userInfo = UserModel.decode(data);
- userInfo.get(‘cyUserno‘);
- ......
另外protobuf.js还提供了一些工具,例如.proto
和.json
的转换等,具体参看他的官网:https://github.com/dcodeIO/ProtoBuf.js
- 完 -
以上是关于ProtoBuf.js – Protocol Buffers的Javascript实现(转)的主要内容,如果未能解决你的问题,请参考以下文章
javascript之ProtoBuf在websocket中的使用