cloudwu / pbc

A protocol buffers library for C
MIT License
1.62k stars 568 forks source link

protobuf.decode 后有一个字段解析是nil,付给全局变量,该字段设置后, 下一次另一个消息decode 如果该字段应该也是nil的 但是里面发现有值,就是之前设置的。 #83

Open zhenmu opened 8 years ago

zhenmu commented 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的深拷贝过去, 就不会有这个问题。

cloudwu commented 8 years ago

不能修改 decode 返回的对象。要修改请自己拷贝。

cloudwu commented 8 years ago

See https://github.com/cloudwu/pbc/issues/75

owent commented 7 years ago

See #80