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

我正在尝试将lua表格进行简单的序列化,并将其反序列化回表格。但是由于某些原因它就是失败了。

local a = {}
a[0] = {name="presetA"}
local line = serpent.line(a)

local presets, err = loadstring(line)

if (err) then
    log("错误")
    log(err)
else
    log("成功")
    log(serpent.block(presets))
end

运行后,log(err) 显示

[string "{[0] = {name = "presetA"}}"]:1: near '{' 附近有意外符号
点赞
用户2858170
用户2858170

loadstring 函数可以从给定字符串中加载 Lua 的语句块并运行。

由于序列化后的表不是有效的 Lua 表达式,因此解释器会报告观察到的错误。

让我们来序列化一个例子:

serpent.line({key = "value"})

会返回:

"{key = "value"} --[[table: 0D80CF40]]"

单独使用表构造函数不是有效的 Lua 表达式。

尝试运行该行时,你会发现 Lua 报告了错误:

input:1: unexpected symbol near '{'

serpent.line 的输出不能用作 loadstring 的输入。

现在看看如果使用 serpent.dump 会有什么不同:

"do local _={name="hallo"};return _;end"

这是一个有效的、可执行的 Lua 代码块,它将返回序列化后的表。

请注意来自 Serpent 文档 的以下部分:

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

虽然你可以使用 loadstring 或 load 函数加载序列化的代码片段,但 Serpent 也提供了 load 函数,它增加了安全性检查,并在片段中有任何可执行代码时报告错误...

请阅读手册。

2017-11-14 17:13:33