在游戏开中我们经常会有将数据转换为一个字节流或者字符流的需求,然后将其存储到一个文件或者通过网络连接发送出去,
在lua中对于保存在table中的数据我们可以简单序列化成json文件保存到本地
--无环table序列化为json格式保存到文件
local file = io.open("1.json", "w")
if(file == nil) then
print("open file 1.txt fail")
end
function getTableLen(tab)
local len = 0
for k, v in pairs(tab) do
len = len + 1
end
return len
end
function serialize(pTable, indent)
indent = indent or 0
local spaceStr = string.rep(" ", indent)
if(type(pTable) == "number") then
file:write(pTable)
elseif(type(pTable) == "string") then
file:write(string.format("%q", pTable))
elseif(type(pTable) == "table") then
indent = indent + 1
spaceStr = string.rep(" ", indent)
file:write("{\n")
local length = getTableLen(pTable)
local index = 0
for k, v in pairs(pTable) do
index = index + 1
file:write(string.format("%s", spaceStr));
serialize(k, indent)
file:write(" : ");
serialize(v, indent)
if(index < length) then
file:write(",\n")
else
file:write("\n")
end
end
local space = string.rep(" ", indent - 1)
file:write(string.format("%s}", space))
else
error("cannot serialize a " .. type(pTable))
end
end
local temp = {
a = 1,
b = 'helloworld "one"',
c = {
dic = {key = 12, value = "class"},
name = "zxh",
sec = {
m = "sikd",
n = 90,
}
}
}
serialize(temp)
file:close()
生成的json文件内容如下:
--有环table或者共享子table(即拓扑结构table)序列化
local file = io.open("1.json", "w")
if(file == nil) then
print("open file 1.txt fail")
end
function basicSerialize(o)
if(type(o) == "number") then
return tostring(o)
elseif(type(o) == "string") then
return string.format("%q", o)
end
end
function save(name ,value, saved)
saved = saved or {}
file:write(name, " = ")
if(type(value) == "number" or type(value) == "string") then
file:write(basicSerialize(value), "\n")
elseif(type(value) == "table") then
if(saved[value]) then
file:write(saved[value], "\n")
else
saved[value] = name
file:write("{}\n")
for k,v in pairs(value) do
k = basicSerialize(k)
local fName = string.format("%s[%s]", name, k)
save(fName, v, saved)
end
end
else
error("cannot save a "..type(vlaue))
end
end
a = {x=1, y=2; {3,4,5}}
a[2] = a
a.z = a[1]
save('a', a)
输出格式如下:
如果需要序列化成json格式,可参考无环做法稍作调整即可,做法类似,这里不再赘述