Open zhenmu opened 8 years ago
具体代码说明下问题吧: 消息定义: 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
具体代码说明下问题吧: 消息定义: 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 部分代码
获取某个物品信息的协议:
有个地方对这个全局变量有赋值:
现在灵异的问题就是: 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的深拷贝过去, 就不会有这个问题。