看了仍是不是很懂,也暂时不知道具体怎么使用比较方便。json
看了这些,再参考下项目的用法,序列号主要是把table表转化成string字符串,使用io文件操做保存到本地文件,加载时经过io加载出来,而后使用loadstring()方法,把string转化成table的数据。在此要注意的是,table序列化成string时,格式要方便使用loadstring方法。lua
还有一篇文章来自:http://dearymz.blog.163.com/blog/static/2056574200939103246797/ spa
一般须要序列化一些数据,也就是将数据转换为一个字节流或字符流,而后就能够将其方便的持久化。文本序列化可选择的格式很是多:SOAP、Json甚至自定义xml等,不过lua脚本也是一个不错的选择方案。设计
本文在参考《Lua程序设计(第2版)》简体中文版 第12章 数据与持久化 12.2 和12.2.1 的基础上给出下面的实现。要注意的是该实现只能针对无环的table,而且不能对function、thread、userdata这三种类型进行序列化和反序列化。为了防止序列化后数据过大,也没有作精细的排版控制。code
function serialize(obj)
local lua = ""
local t = type(obj)
if t == "number" then
lua = lua .. obj
elseif t == "boolean" then
lua = lua .. tostring(obj)
elseif t == "string" then
lua = lua .. string.format("%q", obj)
elseif t == "table" then
lua = lua .. "{\n"
for k, v in pairs(obj) do
lua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ",\n"
end
local metatable = getmetatable(obj)
if metatable ~= nil and type(metatable.__index) == "table" then
for k, v in pairs(metatable.__index) do
lua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ",\n"
end
end
lua = lua .. "}"
elseif t == "nil" then
return nil
else
error("can not serialize a " .. t .. " type.")
end
return lua
end
function unserialize(lua)
local t = type(lua)
if t == "nil" or lua == "" then
return nil
elseif t == "number" or t == "string" or t == "boolean" then
lua = tostring(lua)
else
error("can not unserialize a " .. t .. " type.")
end
lua = "return " .. lua local func = loadstring(lua)
if func == nil then return nil end
return func()
end
data = {["a"] = "a", ["b"] = "b", [1] = 1, [2] = 2, ["t"] = {1, 2, 3}}
local sz = serialize(data)
print(sz)
print("---------")
print(serialize(unserialize(sz)))
orm