引用:http://blog.codingnow.com/cloud/LuaSerializeTable/
--打包数据table,
--1.支持table 嵌套和循环引用 2. 支持 number, string, boolean
function TableToString(t)
local mark={}
local assign={}
local function ser_table(tbl,parent)
mark[tbl]=parent
local tmp={}
for k,v in pairs(tbl) do
local key= type(k)=="number" and "["..k.."]" or "[".. string.format("%q", k) .."]"
if type(v)=="table" then
local dotkey= parent.. key
if mark[v] then
table.insert(assign,dotkey.."='"..mark[v] .."'")
else
table.insert(tmp, key.."="..ser_table(v,dotkey))
end
elseif type(v) == "string" then
table.insert(tmp, key.."=".. string.format('%q', v))
elseif type(v) == "number" or type(v) == "boolean" then
table.insert(tmp, key.."=".. tostring(v))
end
end
return "{"..table.concat(tmp,",").."}"
end
return "do local ret="..ser_table(t,"ret")..table.concat(assign," ").." return ret end"
end
function StringToTable(strData)
local f = loadstring(strData)
if f then
return f()
end
end
--[[
--test0:
t = {}
g = {1,2,3,t}
t.rt = g
local str = TableToString(t)
print(str)
local f = StringToTable(str)
print(f.rt[2])
]]
--[[
--test1:
t = {1,2,3,"sdf", a = "df", d = true, qe = 3, {7}, qq = {{2,3,a={}}}, }
print(t[4])
g = { c = 3, d = 4, t}
t.rt = g
t.f = {1,2,3}
t.m = {3,4,5}
local res = TableToString(t)
local f = StringToTable(res)
print(f.rt.d) --4
print(f.f[1]) --1
print(f[1]) --1
print(f[2]) --2
print(f[3]) --3
print(f[4]) --"sdf"
print(f.a) --"df"
print(f.d) --true
print(f.qe) --3
print(f[5][1]) --7
print(f.qq[1][1]) --2
print(f.qq[1][2]) --3
print(f.qq[1].a) --table:
--]]
----[[
--test3:
--]]
lua中的序列化
最新推荐文章于 2024-02-09 11:32:53 发布