我想将一个2D的lua表格转换成字符串,然后再通过这个新创建的字符串将其转换回表格。这个过程似乎被称为序列化,并在下面的URL中进行了讨论,但我很难理解代码,希望这里有人能提供一个简单的table.toString和table.fromString函数。
http://lua-users.org/wiki/TableSerialization
http://lua-users.org/wiki/TableSerialization
我正在使用下面的代码来序列化表格:
function serializeTable(val, name, skipnewlines, depth)
skipnewlines = skipnewlines or false
depth = depth or 0
local tmp = string.rep(" ", depth)
if name then tmp = tmp .. name .. " = " end
if type(val) == "table" then
tmp = tmp .. "{" .. (not skipnewlines and "\n" or "")
for k, v in pairs(val) do
tmp = tmp .. serializeTable(v, k, skipnewlines, depth + 1) .. "," .. (not skipnewlines and "\n" or "")
end
tmp = tmp .. string.rep(" ", depth) .. "}"
elseif type(val) == "number" then
tmp = tmp .. tostring(val)
elseif type(val) == "string" then
tmp = tmp .. string.format("%q", val)
elseif type(val) == "boolean" then
tmp = tmp .. (val and "true" or "false")
else
tmp = tmp .. "\"[inserializeable datatype:" .. type(val) .. "]\""
end
return tmp
end
创建的代码可以使用loadstring()执行:http://www.lua.org/manual/5.1/manual.html#pdf-loadstring,如果你已经传递了"name"参数(或在之后附加):
s = serializeTable({a = "foo", b = {c = 123, d = "foo"}})
print(s)
a = loadstring(s)()
lhf发布的代码示例比您链接的页面中的任何代码示例都简单得多,因此希望您能更好地理解它。将其调整为输出字符串而不是打印输出的代码如下:
t = {
{11,12,13},
{21,22,23},
}
local s = {"return {"}
for i=1,#t do
s[#s+1] = "{"
for j=1,#t[i] do
s[#s+1] = t[i][j]
s[#s+1] = ","
end
s[#s+1] = "},"
end
s[#s+1] = "}"
s = table.concat(s)
print(s)
序列化的基本思想是从类似表格的数据结构中获取所有数据位,然后遍历该数据结构,同时构建一个字符串,其中包含所有数据位和格式化字符。
#t
需要进行一些迭代来计算表的长度。使用自己的长度计数器变量可能更有效率。 - Ponkadoodle在Kong的工作原理下,它做了这件事。
local cjson = require "cjson"
kong.log.debug(cjson.encode(some_table))
需要安装lua-cjson包,可在https://github.com/openresty/lua-cjson/获取。
loadstring()()
加载回来。将其改为输出到字符串而不是打印出来。提示:重新定义print函数以将输出收集到表格中,然后在最后使用table.concat
将输出表格转换为字符串。t = {
{11,12,13},
{21,22,23},
}
print"return {"
for i=1,#t do
print"{"
for j=1,#t[i] do
print(t[i][j],",")
end
print"},"
end
print"}"
function serialize(t)
local serializedValues = {}
local value, serializedValue
for i=1,#t do
value = t[i]
serializedValue = type(value)=='table' and serialize(value) or value
table.insert(serializedValues, serializedValue)
end
return string.format("{ %s }", table.concat(serializedValues, ', ') )
end
return
,然后存储。-- myfile.lua
return { { 1, 2, 3 }, { 4, 5, 6 } }
t = dofile 'myfile.lua'
serializedValue
将更加复杂。local nl = string.char(10) -- newline
function serialize_list (tabl, indent)
indent = indent and (indent.." ") or ""
local str = ''
str = str .. indent.."{"
for key, value in pairs (tabl) do
local pr = (type(key)=="string") and ('["'..key..'"]=') or ""
if type (value) == "table" then
str = str..nl..pr..serialize_list (value, indent)..','
elseif type (value) == "string" then
str = str..nl..indent..pr..'"'..tostring(value)..'",'
else
str = str..nl..indent..pr..tostring(value)..','
end
end
str = str:sub(1, #str-1) -- remove last symbol
str = str..nl..indent.."}"
return str
end
local str = serialize_list(tables)
print('return '..nl..str)
我有一个较短的代码可将表格转换为字符串,但无法反向转换
function compileTable(table)
local index = 1
local holder = "{"
while true do
if type(table[index]) == "function" then
index = index + 1
elseif type(table[index]) == "table" then
holder = holder..compileTable(table[index])
elseif type(table[index]) == "number" then
holder = holder..tostring(table[index])
elseif type(table[index]) == "string" then
holder = holder.."\""..table[index].."\""
elseif table[index] == nil then
holder = holder.."nil"
elseif type(table[index]) == "boolean" then
holder = holder..(table[index] and "true" or "false")
end
if index + 1 > #table then
break
end
holder = holder..","
index = index + 1
end
return holder.."}"
end
a={}; a[1]=2;
这样的情况。({1=2}
无法转为字符串) 对于 nil 等情况也是如此。不过,对于漂亮的打印输出,已经有其他库可以使用了。 - user202729