lua里table转string(序列化)和string转table(反序列化)

来源:互联网 发布:装饰工程报价软件 编辑:程序博客网 时间:2024/05/29 17:20

网上找到的代码,非常完美,出处已经不可查,见谅


function serialize(obj)    local lua = ""    local t = type(obj)    if t == "number" then        lua = lua .. obj    elseif t == "boolean" then        lua = lua .. tostring(obj)    elseif t == "string" then        lua = lua .. string.format("%q", obj)    elseif t == "table" then        lua = lua .. "{\n"    for k, v in pairs(obj) do        lua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ",\n"    end    local metatable = getmetatable(obj)        if metatable ~= nil and type(metatable.__index) == "table" then        for k, v in pairs(metatable.__index) do            lua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ",\n"        end    end        lua = lua .. "}"    elseif t == "nil" then        return nil    else        error("can not serialize a " .. t .. " type.")    end    return luaendfunction unserialize(lua)    local t = type(lua)    if t == "nil" or lua == "" then        return nil    elseif t == "number" or t == "string" or t == "boolean" then        lua = tostring(lua)    else        error("can not unserialize a " .. t .. " type.")    end    lua = "return " .. lua    local func = loadstring(lua)    if func == nil then        return nil    end    return func()enddata = {["a"] = "a", ["b"] = "b", [1] = 1, [2] = 2, ["t"] = {1, 2, 3}}  local sz = serialize(data)  print(sz)  print("---------")  print(serialize(unserialize(sz)))


function serialize(obj) local lua = "" local t = type(obj) if t == "number" then lua = lua .. obj elseif t == "boolean" then lua = lua .. tostring(obj) elseif t == "string" then lua = lua .. string.format("%q", obj) elseif t == "table" then lua = lua .. "{\n" for k, v in pairs(obj) do lua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ",\n" end local metatable = getmetatable(obj) if metatable ~= nil and type(metatable.__index) == "table" then for k, v in pairs(metatable.__index) do lua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ",\n" end end lua = lua .. "}" elseif t == "nil" then return nil else error("can not serialize a " .. t .. " type.") end return luaendfunction unserialize(lua) local t = type(lua) if t == "nil" or lua == "" then return nil elseif t == "number" or t == "string" or t == "boolean" then lua = tostring(lua) else error("can not unserialize a " .. t .. " type.") end lua = "return " .. lua local func = loadstring(lua) if func == nil then return nil end return func()enddata = {["a"] = "a", ["b"] = "b", [1] = 1, [2] = 2, ["t"] = {1, 2, 3}} local sz = serialize(data) print(sz) print("---------") print(serialize(unserialize(sz)
0 0
原创粉丝点击