首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用serpent库反序列化lua中的表

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

Stack Overflow用户
提问于 2017-11-14 16:14:39
回答 1查看 691关注 0票数 0

因此,我尝试对lua表进行简单的序列化,并将其反序列化回表。但出于某种原因,它只是失败了。

代码语言:javascript
复制
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(err)显示

代码语言:javascript
复制
[string "{[0] = {name = "presetA"}}"]:1: unexpected symbol near '{'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-14 17:13:33

loadstring从给定的字符串加载Lua块并运行它。

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

让我们序列化一个示例:

代码语言:javascript
复制
serpent.line({key = "value"})

返回

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

表构造函数本身并不是有效的Lua表达式。

试着运行这一行,Lua就会报告:

输入:1:“{”附近的意外符号

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

现在,如果您使用serpent.dump代替

代码语言:javascript
复制
"do local _={name="hallo"};return _;end"

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

请注意蛇形文献中的以下部分

注意到,行函数和块函数返回打印得很好的数据结构,如果要反序列化它们,则需要在通过loadstring. (例如:loadstring('return '..require('mobdebug').line("foo"))() == "foo" )运行它们之前添加返回。 虽然可以使用加载字符串或加载函数来加载序列化的片段,但Serpent还提供了load函数,如果片段中有任何可执行代码,则可以添加安全检查并报告错误。

请阅读手册。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47290405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档