我想将2d lua表转换为字符串,然后将其转换为字符串后,使用新创建的字符串将其转换回表中。看来,如果这个过程被称为序列化,在下面的网址进行了讨论,但我有理解代码一个困难的时期,希望有人在这里有一个简单的table.toString和table.fromString功能
http://lua-users.org/wiki/TableSerializationLua table.toString(tableName)和table.fromString(stringTable)函数?
回答
代码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)
系列化的总体思路是把数据的所有位从一些数据结构像一个表,然后遍历数据结构,而建立一个包含所有这些数据位以及格式化字符的字符串。
这是一个简单的程序,它假定你的表只包含数字。它输出可以用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"}"
JSON module怎么样?这样你也可以获得更好的可交换数据。我通常更喜欢dkjson,它也支持utf-8,其中cmjjson不会。
Upvote让我意识到JSON是更好的解决方案。我已经拥有*我在项目中使用过的JSON库,甚至,但我忘记了。 – SomeCallMeTim 2016-03-29 18:06:41
从技术上讲,这并不能回答这个问题,但使用JSON可能比数据序列化更好。 – jhocking 2016-07-08 19:36:21
假设:
- 您没有循环(表引用表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
将更复杂 。
问候!
以序列表我使用下面的代码:
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)()
你知道,tostring也适用于布尔值。 tostring(true)==“true” – Ponkadoodle 2011-05-22 18:34:38
修改了一下并使用了它。谢谢 :) – 2018-01-11 11:08:16
- 1. Lua C API和metatable函数
- 2. FROM`tableName`和FROM tableName有什么不同?
- 3. Lua:函数表
- 4. Lua合并函数
- 5. nodemcu Lua sqr函数
- 6. LuaBridge回调(通过Lua函数和C++)
- 7. lu。[TableName]而不是dbo。[TableName]?
- 8. 添加Lua函数语法
- 9. 模板函数绑定lua
- 10. lua userdata C++析构函数
- 11. lua中的全局函数
- 12. 存储一个Lua函数?
- 13. lua修改函数内部的数组
- 14. LUA不修改函数参数
- 15. 从.lua的使用手柄调用lua函数?
- 16. 黑客Lua - 注入新的函数到内置的Lua中
- 17. 用C++ Lua函数返回字符串
- 18. 在Lua中创建回调函数
- 19. 从C++调用Lua 5.2函数
- 20. LuaJ - 在Java中创建Lua函数
- 21. 在C/C++中引用Lua函数
- 22. 安全Lua调用C++注册函数
- 23. 使用函数作为变量,LUA
- 24. 在Lua表中注册C函数
- 25. 从Lua程序中调用python函数
- 26. Luabind有条件地调用Lua函数
- 27. 如何从Javascript调用Lua函数
- 28. 从字符串创建Lua函数
- 29. lua中的内部函数性能
- 30. Lua 3d表对函数返回nil值
感谢您的代码。我的意思是重新定义'print'或使用不同的函数来收集表格中的输出,以便可以保持原始代码基本完好无损。 – lhf 2011-05-20 18:32:55
我讨厌重载函数,因为我总是忘记我改变了它。 – jhocking 2011-05-20 18:52:24
我相信'#t'必须做一些迭代来计算表的长度。使用自己的长度计数器变量可能更有效。 – Ponkadoodle 2011-05-22 18:32:49