在 as3 中使用 protobuf

在最近参与开发的 adobe air 项目中,前后端的通信协议从 XML、JSON 再到 protobuf,最后选择 protobuf 原因,主要是前后端维护 protobuf 协议就行了,同时还可以利用 IDE 做一些编译检查。

  目前我能找到的 protobuf as3 开源库,都存在一些问题:不支持嵌套类生成代码无法编译 等等。于是花了一点时间,参考 google protobuf 相关说明,编写 protobuf-as3 以及 protoc-as3,用于支持运行时及代码生成 Github

  protobuf-as3 库只支持 proto3 格式,proto3 列出的数据类型基本都支持。

1. Proto 定义

  以下 proto 文件将生成 5个 as3 类:Token.as、Token$Type.as、TokenBindingResponseCode.as、TokenBindingRequest.as、TokenBindingResponse.as。我们以 $ 作为分隔符以实现 protobuf 类的嵌套。

token.proto
syntax = "proto3";
package user.token;

message Token {
enum Type {
NONE = 0;
QQ = 1;
WEIBO = 2;
WECHAT = 3;
}

Type type = 1;
string value = 2;
}

enum TokenBindingResponseCode {
ERROR = 0;
OK = 200;
EXIST = 400;
}

message TokenBindingRequest {Token token = 1;}

message TokenBindingResponse {
TokenBindingResponseCode responseCode = 1;
Token token = 2;
}

2. 代码使用

var token:Token = new Token();
token.type = Token$Type.QQ;
token.value = "xxxxxx";

var req:TokenBindingRequest = new TokenBindingRequest();
req.token = token;

protobuf 数据不包含任何的元数据,所以对于一段数据而言,你是不能够区别这段数据是属于哪一条协议的,因此对于前后端的交互,可以引入 12 字节的头部(length、session、type)。