尝试使用serpent库反序列化和序列化lua中的表

时间:2017-11-14 16:14:40

标签: serialization lua deserialization

因此,我尝试对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 '{'

1 个答案:

答案 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块,它将返回序列化表。

请注意serpent documentation

中的以下部分
  

请注意,行和块函数返回漂亮打印的数据   结构,如果要反序列化它们,则需要添加返回值   在通过loadstring运行它们之前。例如:   loadstring('return '..require('mobdebug').line("foo"))() == "foo"

     

虽然您可以使用loadstring或load函数来加载序列化   片段,Serpent还提供加载功能,增加了安全检查   如果片段中有任何可执行代码,则报告错误...

请阅读手册。