9

我可能错过了这一点,但是是否有一种内置方法可以将 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表即可。

4

5 回答 5

10

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

使用TableSerialization页面或我的Serpent 序列化器和 pretty-printer中的一种实现会更好。

于 2012-06-13T19:14:03.613 回答
5

单独的 Lua 没有任何这样的内置函数,但实现一个并不困难。这里列出了一些预烘焙的实现:http: //lua-users.org/wiki/TableSerialization

于 2012-01-31T04:20:14.567 回答
2
require "json"
local t = json.decode( jsonFile( "sample.json" ) )

在这里参考一个简单的 json 序列化器。

于 2012-01-31T05:44:02.527 回答
0

rxi /json.lua中的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 行以跳过具有函数类型的值。

于 2020-09-27T10:03:16.573 回答
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)
于 2021-01-08T09:02:50.930 回答