ProtoBuf.js – Protocol Buffers 的 Javascript 实现
2014-07-31 · 610 chars · 4 min read
在 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
- 完 -



