用于序列化lua表的方法

时间:2012-01-31 04:09:23

标签: serialization lua corona lua-table

我可能错过了这个,但有没有内置的方法将lua表序列化/反序列化为文本文件,反之亦然?

我有一对方法可以在固定格式的lua表上执行此操作(例如3列数据,5行)。

有没有办法在任何任意格式的lua表上执行此操作?

举个例子,给出这个lua表:

local scenes={
    {name="scnSplash",
        obj={
            {
                name="bg",
                type="background",
                path="scnSplash_bg.png",
            },
            {
                name="bird",
                type="image",
                path="scnSplash_bird.png",
                x=0, 
                y=682,
            },
        }
    },
}

它会被转换成这样的文字:

{name="scnSplash",obj={{name="bg",type="background",path="scnSplash_bg.png",},{name="bird",  type="image",path="scnSplash_bird.png",x=0,y=682,}},}

序列化文本的格式可以任何方式定义,只要文本字符串可以反序列化为空的lua表。

5 个答案:

答案 0 :(得分:8)

我不确定为什么JSON库被标记为正确答案,因为它似乎在序列化“任意格式的lua表”时非常有限。它不将boolean / table / function值作为键处理,也不处理循环引用。共享引用未序列化为共享,并且math.huge值未在Windows上正确序列化。我意识到其中大部分都是JSON限制(因此在库中以这种方式实现),但这被提议作为通用Lua表序列化的解决方案(它不是)。

使用TableSerialization页面或我的Serpent serializer and pretty-printer中的一个实现会更好。

答案 1 :(得分:4)

仅仅Lua没有任何这样的内置,但实现一个并不困难。此处列出了许多预烘焙实现:http://lua-users.org/wiki/TableSerialization

答案 2 :(得分:2)

require "json"
local t = json.decode( jsonFile( "sample.json" ) )

为简单的json序列化程序引用here

答案 3 :(得分:0)

json.lua中的rxi/json.lua添加到您的项目中,然后将其用于:

local json = require("json")

local encoded = json.encode({
  name = "J. Doe",
  age = 42
})

local decoded = json.decode(encoded)

print(decoded.name)

请注意,如果您尝试序列化的值中包含函数,则代码会阻塞。您必须在代码中修复第82和93行,以跳过具有函数类型的值。

答案 4 :(得分:0)

小解决方案:key可以不用括号,但要确保这里没有减号或其他特殊符号。

local nl = string.char(10) -- newline
function serialize_list (tabl, indent)
    indent = indent and (indent.."  ") or ""
    local str = ''
    str = str .. indent.."{"..nl
    for key, value in pairs (tabl) do
        local pr = (type(key)=="string") and ('["'..key..'"]=') or ""
        if type (value) == "table" then
            str = str..pr..serialize_list (value, indent)
        elseif type (value) == "string" then
            str = str..indent..pr..'"'..tostring(value)..'",'..nl
        else
            str = str..indent..pr..tostring(value)..','..nl
        end
    end
    str = str .. indent.."},"..nl
    return str
end

local str = serialize_list(tables)
print(str)