lua里实现table的序列化和反序列化
2017-07-16 20:59
399 查看
感谢原作者辛勤整理:Lua table的序列化和反序列化
--------------table转字符串(只取标准写法,以防止因系统的遍历次序导致ID乱序)
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 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
--------------table转字符串(只取标准写法,以防止因系统的遍历次序导致ID乱序)
function sz_T2S(_t) local szRet = "{" function doT2S(_i, _v) if "number" == type(_i) then szRet = szRet .. "[" .. _i .. "] = " if "number" == type(_v) then szRet = szRet .. _v .. "," elseif "string" == type(_v) then szRet = szRet .. '"' .. _v .. '"' .. "," elseif "table" == type(_v) then szRet = szRet .. sz_T2S(_v) .. "," else szRet = szRet .. "nil," end elseif "string" == type(_i) then szRet = szRet .. '["' .. _i .. '"] = ' if "number" == type(_v) then szRet = szRet .. _v .. "," elseif "string" == type(_v) then szRet = szRet .. '"' .. _v .. '"' .. "," elseif "table" == type(_v) then szRet = szRet .. sz_T2S(_v) .. "," else szRet = szRet .. "nil," end end end table.foreach(_t, doT2S) szRet = szRet .. "}" return szRet end字符串转table(反序列化,异常数据直接返回nil)
function t_S2T(_szText) --栈 function stack_newStack() local first = 1 local last = 0 local stack = {} local m_public = {} function m_public.pushBack(_tempObj) last = last + 1 stack[last] = _tempObj end function m_public.temp_getBack() if m_public.bool_isEmpty() then return nil else local val = stack[last] return val end end function m_public.popBack() stack[last] = nil last = last - 1 end function m_public.bool_isEmpty() if first > last then first = 1 last = 0 return true else return false end end function m_public.clear() while false == m_public.bool_isEmpty() do stack.popFront() end end return m_public end function getVal(_szVal) local s, e = string.find(_szVal,'"',1,string.len(_szVal)) if nil ~= s and nil ~= e then --return _szVal return string.sub(_szVal,2,string.len(_szVal)-1) else return tonumber(_szVal) end end local m_szText = _szText local charTemp = string.sub(m_szText,1,1) if "{" == charTemp then m_szText = string.sub(m_szText,2,string.len(m_szText)) end function doS2T() local tRet = {} local tTemp = nil local stackOperator = stack_newStack() local stackItem = stack_newStack() local val = "" while true do local dLen = string.len(m_szText) if dLen <= 0 then break end charTemp = string.sub(m_szText,1,1) if "[" == charTemp or "=" == charTemp then stackOperator.pushBack(charTemp) m_szText = string.sub(m_szText,2,dLen) elseif '"' == charTemp then local s, e = string.find(m_szText, '"', 2, dLen) if nil ~= s and nil ~= e then val = val .. string.sub(m_szText,1,s) m_szText = string.sub(m_szText,s+1,dLen) else return nil end elseif "]" == charTemp then if "[" == stackOperator.temp_getBack() then stackOperator.popBack() stackItem.pushBack(val) val = "" m_szText = string.sub(m_szText,2,dLen) else return nil end elseif "," == charTemp then if "=" == stackOperator.temp_getBack() then stackOperator.popBack() local Item = stackItem.temp_getBack() Item = getVal(Item) stackItem.popBack() if nil ~= tTemp then tRet[Item] = tTemp tTemp = nil else tRet[Item] = getVal(val) end val = "" m_szText = string.sub(m_szText,2,dLen) else return nil end elseif "{" == charTemp then m_szText = string.sub(m_szText,2,string.len(m_szText)) local t = doS2T() if nil ~= t then szText = sz_T2S(t) tTemp = t --val = val .. szText else return nil end elseif "}" == charTemp then m_szText = string.sub(m_szText,2,string.len(m_szText)) return tRet elseif " " ~= charTemp then val = val .. charTemp m_szText = string.sub(m_szText,2,dLen) else m_szText = string.sub(m_szText,2,dLen) end end return tRet end local t = doS2T() return t end
其他方式:
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 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
相关文章推荐
- Lua里实现将table转成字符串(序列化)和将字符串转换回table(反序列化)
- Lua里实现将table转成字符串(序列化)和将字符串转换回table(反序列化)
- Lua里实现将table转成字符串(序列化)和将字符串转换回table(反序列化)
- Lua里实现将table转成字符串(序列化)和将字符串转换回table(反序列化)
- Lua里实现将table转成字符串(序列化)和将字符串转换回table(反序列化)
- lua里table转string(序列化)和string转table(反序列化)
- Lua 中实现 protobuf 序列化,反序列化
- Lua中实现php序列化及反序列化函数
- Lua 中实现 protobuf 序列化,反序列化
- 对象的序列化和反序列化及其实现和使用
- Redis+protostuff 实现对象序列化保存,反序列化获取
- JSON 序列化和反序列化——JavaScriptSerializer实现
- C#实现对象的Xml格式序列化及反序列化
- lua序列化table表到文件中
- Android中通过Serializable实现对象序列化和反序列化
- Lua面向对象编程系列-通过Table和Metatable来实现类机制
- Avro实现序列化和反序列化
- C#实现对象的Xml格式序列化及反序列化
- 线程实现方式以及序列化 反序列化.java
- 用序列化与反序列化实现C#中对Class类型参数的传值调用