Protobuf Lua版注意事项

发表于2018-09-07
评论0 5.6k浏览
在Unity中接入tolua热更框架,假如要使用通信协议是protobuf,那么就需要使用客户端lua版,下面给大家总结下在使用过程中要注意的地方。

repeated 类型:

假设我们定义了一个请求包和回包的结构如下:
//玩家信息数据结构
message PlayerInfo{
    required string Name = 1;
    required int32 Id = 2;
}
//请求包
message GetPlayerListReq{
    repeated int32 Ids = 1;
}
//回包
message GetPlayerListRes{
    repeated PlayerInfo players = 1;
}

大概的功能就是客户端向服务器发送一个要查询的玩家 id 列表,服务器把对应 id 的玩家信息 PlayerInfo 列表下发下来,这就涉及到构造数据包和解析数据包的过程了,序列化和反序列化的过程在这里就不做赘述了,主要说一下在 lua 下的几个要点:

1.构造 repeated 基础数据类型:

基础数据类型列表要用 :append() 接口来插入,不能使用 table.insert 来插入:
local req = GetPlayerListReq()
for i=0,4 do
    req.Ids:append(id)
end

2.构造 repeated 结构数据类型:

复杂数据结构类型的数据列表需要使用 :add() 来创建,然后挨个属性复制,不能直接把一个属性相同的数据结构直接赋值给它:
local res = GetPlayerListRes()
for i=0,4 do
    local player = req.players:add()
    player.Name = name
    player.Id = id
end

不能直接使用下面的方式赋值:
local res = GetPlayerListRes()
res.players = players

3.解析 repeated 数据类型:

我们通常使用以下方式来遍历一个 table ,这里以服务器解析 id 列表为例:
for k,v in pairs(req.Ids) do
    ...
end

但是假如这里我们使用上述的办法遍历列表就会发现 v 出现了为 nil 的情况,现在就是遍历不准确了,当然可以做如下优化得到正确的结果:
for k,v in pairs(req.Ids) do
    if v ~= nil then
    ...
  end
end

但是很麻烦,而且不准确,对于 protobuf 中定义的数据中包含的 table 数据需要使用 ipairs 来进行遍历,基础数据类型跟复杂数据结构都是一样的:
for k,v in ipairs(req.Ids) do
    ...
end

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引