生成 proto lua 文件
- 将 proto 文件放在 in/ 文件夹下
- 执行 PBParser.bat 文件,会在 out/ 文件夹下生成 pb_define.lua + pb_class.lua 文件
- pb_define.lua : 使用 emmylua 注释提供编码时自动补全提示,该文件在实际运行时是不需要的
- pb_class.lua : proto 中定义的枚举和消息类定义,运行时需要先 require 该文件
- 可以手动修改 PBParser.bat 中的 node 启动参数,参数如下:
- inDir : proto 文件所在目录,默认 “in/”
- outDir : lua 文件输出目录,默认 “out/”
- dName : lua 注释声明输出文件名(不包含后缀),默认为 pb_define
- cName : lua 类输出文件名(不包含后缀),默认为 pb_class
- dPackage : 未指定包的 proto 默认包名,默认为 default
- package : 强制所有 proto 以该包名输出,默认不强制
user.proto
syntax = "proto3";
package xx;
//性别枚举
enum Gender {
unkown = 0; //未知
male = 1; //男性
female = 2; //女性
}
//用户
message User {
string Name = 1;
Gender Gender = 2;
uint32 Age = 3;
int64 Coin = 4;
repeated string Titles = 5;
}
pb_define.lua
local pbUser
pb_class.lua
pb = pb or {}
pb.Gender = {
unkown = 0,
male = 1,
female = 2
}
pb.User = xx.Class("pb.User", xx.PBObject)
function pb.User:ctor()
xx.PBObject.ctor(self, "xx", "User")
end
使用 xx.Protobuf 进行编码和解码
- require protobuf.lua 库文件
require "protobuf"
require "pb_class"
- 以任何方式获取到 proto 文件(改为 lua 脚本,直接 require,运行时动态加载等),假如 proto 文件内容为 protoStr,如下初始化:
xx.Protobuf.parse(protoStr)
- 编码 proto 对象
local user = pb.User()
user.Name = "xx"
user.Gender = pb.Gender.male
user.Age = 18
user.Coin = 999999999999
user.Titles = {"Killer", "Queen", "Dear"}
local bytes = xx.Protobuf.encode(user)
local user2 = {
Name = "xx",
Gender = pb.Gender.male,
Age = 18,
Coin = 999999999999,
Titles = {"Killer", "Queen", "Dear"}
}
local bytes2 = xx.Protobuf.encodeBy("xx","User", user2)
- 解码 proto 对象
local userDecoded = xx.Protobuf.decode(pb.User, bytes)
local userDecoded2 = xx.Protobuf.decodeBy("xx", "User", bytes)