pbc
pbc copied to clipboard
protobuf.decode 后有一个字段解析是nil,付给全局变量,该字段设置后, 下一次另一个消息decode 如果该字段应该也是nil的 但是里面发现有值,就是之前设置的。
具体代码说明下问题吧: 消息定义: message refine_set { optional int32 set_attrs = 1; optional int32 set_quality = 2; }
message rep_E_C2S_EQUIP_GET_REFINE { optional int32 isok = 1; repeated refine_set sets = 2; }
lua 部分代码
获取某个物品信息的协议:
LuaHelper.QueueSend(E_PROTOCOL.E_C2S_EQUIP_GET_REFINE, stringbuffer,
function(msg)
local decode = protobuf.decode("protos.rep_E_C2S_EQUIP_GET_REFINE", msg:GetBodyInLua())
if decode.isok == 1 then
print("Success to req_E_C2S_EQUIP_GET_REFINE")
tb_settingDatas = {} --这是一个全局变量
tb_settingDatas = decode.sets --sets 可能不赋值,那就是nil
有个地方对这个全局变量有赋值:
if tb_settingDatas[curSettingId + 1] == nil then
tb_settingDatas[curSettingId + 1] = {}
end
tb_settingDatas[curSettingId + 1].set_quality = qualityflag
tb_settingDatas[curSettingId + 1].set_attrs = attrflag
现在灵异的问题就是: A物品 返回的协议里 .sets是有内容的 比如.sets[1].set_attrs值是1 B物品 返回的协议里 .sets 空 C物品 返回的协议里 .sets 空
如果 对B物品进行设置, 然后把 tb_settingDatas[1].set_attrs = 2
结果 去获取A物品 .sets[1].set_attrs值是1 去获取C物品 .sets[1].set_attrs值是2 但是服务器发给客户端 C物品 .sets 是没有赋值的,空的。 但为什么会有值呢? 每次都是 protobuf.decode出来的, 难道有什么缓存?
临时解决方案: tb_settingDatas = decode.sets 不要这么写, 用了table的深拷贝过去, 就不会有这个问题。
不能修改 decode 返回的对象。要修改请自己拷贝。
See https://github.com/cloudwu/pbc/issues/75
See #80