lua里实现table的序列化和反序列化
来源:互联网 发布:网络暴力英文ppt 编辑:程序博客网 时间:2024/06/05 01:17
感谢原作者辛勤整理:Lua table的序列化和反序列化
--------------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
阅读全文
0 0
- lua里实现table的序列化和反序列化
- Lua里实现将table转成字符串(序列化)和将字符串转换回table(反序列化)
- Lua里实现将table转成字符串(序列化)和将字符串转换回table(反序列化)
- Lua里实现将table转成字符串(序列化)和将字符串转换回table(反序列化)
- Lua里实现将table转成字符串(序列化)和将字符串转换回table(反序列化)
- Lua里实现将table转成字符串(序列化)和将字符串转换回table(反序列化)
- lua里table转string(序列化)和string转table(反序列化)
- lua Table的序列化与反序列化函数
- .NET里的序列化和反序列化
- .NET里的序列化和反序列化
- python3里的序列化和反序列化
- android里序列化和反序列化的综合分析
- Lua 中实现 protobuf 序列化,反序列化
- Lua 中实现 protobuf 序列化,反序列化
- jackson的序列化和反序列化的实现
- 实现对象的序列化和反序列化
- java序列化和反序列化的简单实现
- 实现empList的序列化和反序列化
- Http状态码
- 【图论经典题】战争
- 常见的神经网络的优化方法
- JMS发布订阅(Pub/Sub)模式示例
- 前端面试题总结HTML CSS部分
- lua里实现table的序列化和反序列化
- 洛谷P3371 单源最短路径(Dijkstra+堆优化)
- noi 2017 游记
- tensorflow string_to_number to_double
- 【c#】DataTable分页处理
- 打印100的阶乘(大数问题,Java好解)
- B/S详解
- 一些字符串处理函数的实现!
- API之Boolean学习