在cocos2dx-lua中应用pbc解析protobuf协议格式发现,其对嵌套消息的解析很不友好。 经过for pairs循环检验发现,decode方法并没有解析内部嵌套的子消息。
修改:protpbuf.lua
增加以下方法
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
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默认将枚举解析成字符串,这使用起来有不是很方便,修改如下:
static void
push_value(lua_State *L, int type, const char * type_name, union pbc_value *v) {
switch(type) {
case PBC_INT:
lua_pushinteger(L, (int)v->i.low);
break;
case PBC_REAL:
lua_pushnumber(L, v->f);
break;
case PBC_BOOL:
lua_pushboolean(L, v->i.low);
break;
case PBC_ENUM:
//lua_pushstring(L, v->e.name); // 支持整数
lua_pushinteger(L, v->e.id);
break;
...
}
解析pb时使用
_reader[1] = function(msg) return _reader.int end
_reader[2] = function(msg) return _reader.real end
_reader[3] = function(msg) return _reader.bool end
--_reader[4] = function(msg) return _reader.string end
_reader[4] = function(msg) return _reader.int end
_reader[5] = function(msg) return _reader.string end
_reader[6] = function(msg)
local message = _reader.message
return function(self,key)
return message(self, key, msg)
end
end
_writer[1] = function(msg) return _writer.int end
_writer[2] = function(msg) return _writer.real end
_writer[3] = function(msg) return _writer.bool end
--_writer[4] = function(msg) return _writer.string end
_writer[4] = function(msg) return _writer.int end
_writer[5] = function(msg) return _writer.string end
_writer[6] = function(msg)
local message = _writer.message
return function(self,key , v)
return message(self, key, v, msg)
end
end
但是proto文件定义的枚举值,在lua还是不能直接使用,需要在lua重新定义下,这个有谁找到了解决办法,求告之!