【问题标题】:method for serializing lua tableslua表序列化方法
【发布时间】:2023-03-22 23:18:02
【问题描述】:

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

【问题讨论】:

标签: serialization lua coronasdk lua-table


【解决方案1】:

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

使用TableSerialization 页面或我的Serpent serializer and pretty-printer 中的一种实现会更好。

【讨论】:

  • 我同意你的观点,Lua 不是 JS。
【解决方案2】:

Lua 本身没有任何这样的内置函数,但实现一个并不困难。此处列出了许多预烘焙的实现:http://lua-users.org/wiki/TableSerialization

【讨论】:

  • 哎呀,难怪lua表看起来像json,here已经有一个Corona库。
【解决方案3】:
require "json"
local t = json.decode( jsonFile( "sample.json" ) )

参考here 获取一个简单的 json 序列化器。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      小解: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)
      

      【讨论】:

        猜你喜欢
        • 2012-06-02
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 2012-11-07
        • 2010-10-08
        • 2011-05-29
        • 2014-10-01
        • 1970-01-01
        相关资源
        最近更新 更多