• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

cocos2dx-lua采用pbc解析proto问题修正

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在cocos2dx-lua中应用pbc解析protobuf协议格式发现,其对嵌套消息的解析很不友好。 经过for pairs循环检验发现,decode方法并没有解析内部嵌套的子消息。

进一步检查发现,子消息的输出格式为table:第一个字段为子消息的名字, 第2个字段为一个奇怪的字符串(一般为子消息的第一个字段)。进行了各种尝试,发现只要访问一次子消息实际存在的字段,则子消息的结构自动输出为正常。

很奇怪吧!大神的代码总是用各种元表奇奇怪怪的实现来追求效率, 而实际游戏开发中总是需要各种通用的写法。

如果不能对字段进行打印调试毫无疑问是没办法正常开发的,最后发现只要针对子消息结构调用一次decode则可以解决嵌套消息无法正常输出的问题。需要编写下面代码

function decodeAll(typename, buffer)
   local ret = decode(typename, buffer, length)
   if ret then
      decodeTable(ret)
   end
   return ret
end

function decodeTable(tbl)
   for k,v in pairs(tbl) do
       if type(v) == "table" then
          --这里的xxxx请自行替换成protobuf的package
          if(type(v[1]) == "string" and string.find(v[1],"XXXXX.")) then
               local ret = decode(v[1], v[2])
               if ret then
                  tbl[k] = ret
               end
          end
          decodeTable(tbl[k])
       end
   end
end

  游戏中调用protobuf.decodeAll即可正常解析了

另外发现decode后的lua table在访问不存在的字段会报assert, 修改下面这个方法可以解决这个问题

function _decode_type_meta:__index(key)
    local t, msg = c._env_type(P, self._CType, key)
    --local func = assert(_reader[t], key)(msg)
    local reader = _reader[t]
    local func
    if reader then
        func = reader(msg)
    else
        func = function() end
    end
    self[key] = func
    return func
end

  这样我们就可以在游戏中比较友好的使用pbc来解析proto格式了

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua字符串处理发布时间:2022-07-22
下一篇:
Lua中的正则表达式的使用发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap