Lua Protobuf

生成 proto lua 文件

  1. 将 proto 文件放在 in/ 文件夹下
  2. 执行 PBParser.bat 文件,会在 out/ 文件夹下生成 pb_define.lua + pb_class.lua 文件
    • pb_define.lua : 使用 emmylua 注释提供编码时自动补全提示,该文件在实际运行时是不需要的
    • pb_class.lua : proto 中定义的枚举和消息类定义,运行时需要先 require 该文件
  3. 可以手动修改 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

---@alias pbGender number
---@class pbUser:PBObject @用户
---@field Name string
---@field Gender pbGender
---@field Age number
---@field Coin number
---@field Titles string[]
local pbUser

pb_class.lua

pb = pb or {}
---性别枚举
pb.Gender = {
	---未知 0
	---@type pbGender
	unkown = 0,
	---男性 1
	---@type pbGender
	male = 1,
	---女性 2
	---@type pbGender
	female = 2
}
---@type pbUser
pb.User = xx.Class("pb.User", xx.PBObject)
function pb.User:ctor()
	xx.PBObject.ctor(self, "xx", "User")
end

使用 xx.Protobuf 进行编码和解码

  1. require protobuf.lua 库文件
    require "protobuf"
	require "pb_class"
  1. 以任何方式获取到 proto 文件(改为 lua 脚本,直接 require,运行时动态加载等),假如 proto 文件内容为 protoStr,如下初始化:
    xx.Protobuf.parse(protoStr)
  1. 编码 proto 对象
---@type pbUser
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)

-- or 使用 proto 中有包名 "xx" 和消息名 "User"
---@type pbUser
local user2 = {
    Name = "xx",
    Gender = pb.Gender.male,
    Age = 18,
    Coin = 999999999999,
    Titles = {"Killer", "Queen", "Dear"}
}
--编码
local bytes2 = xx.Protobuf.encodeBy("xx","User", user2)
  1. 解码 proto 对象
---@type pbUser
local userDecoded = xx.Protobuf.decode(pb.User, bytes)

-- or 使用 proto 中有包名 "xx" 和消息名 "User"(推荐)
---@type pbUser
local userDecoded2 = xx.Protobuf.decodeBy("xx", "User", bytes)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wx771720

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值