我使用LoadString是总是想让他处理一大些事后返回,可是总是不成功,原来是我的语句间隔不对(要用';'或什么都不用),换成分号后就行了我写的可以嵌套的table表序列化函数,而且做了最深的递归深度限制,序列化结果为字符串,以后你想怎样处理就怎样处理,方便多了。而且使用时直接loadstring就行了,方便做异常处理
function SerializeUltra(tbl,saved,TopName)--序列化table函数
local saved = saved or {}
local TopName = TopName or 'temp'
local function BasicSerialze(o)
if type(o) == type(0) then
return tostring(o)
else
return string.format("%q",o)--格式化处理
end
end
local ret = {}
local function Serialize(tbl,saved,name,level)
local name = name or "temp"
local level = level or 0
--print (level)
level = level + 1
if level > 20 then --限制为最高20层table
error("too deep to servialize!")
end
table.insert(ret,name..' = ')
if type(tbl) == "table" then
if saved[tbl] then
table.insert(ret,saved[tbl]..";\n")
else
saved[tbl] = name
table.insert(ret,"{};\n")
for k,v in pairs(tbl) do
local _k = BasicSerialze(k)
if _k == nil then
error("servialize with an error key!")
end
local tname = string.format("%s[%s]",name,_k)
Serialize(v,saved,tname,level)
end
end
else
table.insert(ret,string.format("%s;\n",BasicSerialze(tbl)))
end
end
Serialize(tbl,saved,TopName)
return string.format("local %sreturn %s",table.concat(ret),TopName)
end
示例程序:
userObj = {
[1] = {
['id']=1,
['name']='ice',
['grade']=0,
['sumGrade']=0,
},
}
userObj[2] = userObj[1]
strTbl=SerializeUltra(userObj)
print (strTbl)
zz=loadstring(strTbl)()
print(zz[2].name)
运行结果:
local temp = {};
temp[1] = {};
temp[1]["id"] = 1;
temp[1]["sumGrade"] = 0;
temp[1]["name"] = "ice";
temp[1]["grade"] = 0;
temp[2] = temp[1];
return temp
ice