因此,我尝试对lua表进行简单的序列化,并将其反序列化为表。但由于某种原因,它只是失败了。
local a = {}
a[0] = {name="presetA"}
local line = serpent.line(a)
local presets, err = loadstring(line)
if (err) then
log("Error")
log(err)
else
log("Success")
log(serpent.block(presets))
end
运行后,log(错误)显示
[string "{[0] = {name = "presetA"}}"]:1: unexpected symbol near '{'
答案 0 :(得分:4)
loadstring从给定的字符串加载Lua块并运行它。
由于您的序列化表不是有效的Lua表达式,解释器会报告观察到的错误。
让我们序列化一个例子:
serpent.line({key = "value"})
返回
“{key =”value“} - [[table:0D80CF40]]”
它自己的表构造函数不是有效的Lua表达式。
尝试运行该行,Lua将报告:
输入:1:'{'
附近的意外符号
serpent.line的输出不能用作loadstring
的输入。
现在看看使用serpent.dump
而不是
"do local _={name="hallo"};return _;end"
这是一个有效的,可执行的Lua块,它将返回序列化表。
中的以下部分请注意,行和块函数返回漂亮打印的数据 结构,如果要反序列化它们,则需要添加返回值 在通过loadstring运行它们之前。例如:
loadstring('return '..require('mobdebug').line("foo"))() == "foo"
。虽然您可以使用loadstring或load函数来加载序列化 片段,Serpent还提供加载功能,增加了安全检查 如果片段中有任何可执行代码,则报告错误...
请阅读手册。