2011-05-20 33 views

回答

7

代码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) 

系列化的总体思路是把数据的所有位从一些数据结构像一个表,然后遍历数据结构,而建立一个包含所有这些数据位以及格式化字符的字符串。

+0

感谢您的代码。我的意思是重新定义'print'或使用不同的函数来收集表格中的输出,以便可以保持原始代码基本完好无损。 – lhf 2011-05-20 18:32:55

+1

我讨厌重载函数,因为我总是忘记我改变了它。 – jhocking 2011-05-20 18:52:24

+1

我相信'#t'必须做一些迭代来计算表的长度。使用自己的长度计数器变量可能更有效。 – Ponkadoodle 2011-05-22 18:32:49

2

这是一个简单的程序,它假定你的表只包含数字。它输出可以用loadstring()()加载的Lua代码。适应它输出到一个字符串,而不是打印出来。提示:重新定义打印以将输出收集到一个表中,然后在最后将输出表转换为一个字符串,其中包含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"}" 
4

JSON module怎么样?这样你也可以获得更好的可交换数据。我通常更喜欢dkjson,它也支持utf-8,其中cmjjson不会。

+0

Upvote让我意识到JSON是更好的解决方案。我已经拥有*我在项目中使用过的JSON库,甚至,但我忘记了。 – SomeCallMeTim 2016-03-29 18:06:41

+0

从技术上讲,这并不能回答这个问题,但使用JSON可能比数据序列化更好。 – jhocking 2016-07-08 19:36:21

1

假设:

  • 您没有循环(表引用表B和B引用)
  • 你的表是纯阵列(所有键都是连续的正整数,开始1)
  • 你值仅整数(无串等)

然后递归的解决方案很容易实现:

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的字符串,其存储在一个文件.lua:

-- myfile.lua 
return { { 1, 2, 3 }, { 4, 5, 6 } } 

你可以使用dofile得到表背。

t = dofile 'myfile.lua' 

注:

  • 如果你有循环,那么你将有 明确地处理它们 - 通常是一个额外的表来“跟踪”重复
  • 如果你不这样做有纯数组,那么你将不得不解析t, 以及处理键的呈现方式(它们是字符串吗?它们是其他表吗?等等)。
  • 如果你有更多的只是整数 和子表,然后计算 serializedValue将更复杂 。

问候!

7

以序列表我使用下面的代码:

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 

创建的代码,然后可以使用加载链()执行:http://www.lua.org/manual/5.1/manual.html#pdf-loadstring如果你通过一个参数“名称”参数(或追加它后来):

s = serializeTable({a = "foo", b = {c = 123, d = "foo"}}) 
print(s) 
a = loadstring(s)() 
+1

你知道,tostring也适用于布尔值。 tostring(true)==“true” – Ponkadoodle 2011-05-22 18:34:38

+0

修改了一下并使用了它。谢谢 :) – 2018-01-11 11:08:16