登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

lua对象的序列化  

2009-04-09 22:32:46|  分类: Lua |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    通常需要序列化一些数据,也就是将数据转换为一个字节流或字符流,然后就可以将其方便的持久化。文本序列化可选择的格式非常多:SOAPJson甚至自定义xml等,不过lua脚本也是一个不错的选择方案。

    本文在参考《Lua程序设计(第2版)》简体中文版 第12章 数据与持久化 12.2 和12.2.1 的基础上给出下面的实现。要注意的是该实现只能针对无环的table,并且不能对function、thread、userdata这三种类型进行序列化和反序列化。为了防止序列化后数据过大,也没有做精细的排版控制。

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}}
--print(serialize(unserialize(1)))
--print(serialize(unserialize(serialize(data))))


 2009-04-10:

    配合《lua readonly table》一文中提到的lua只读表格,添加对lua只读表格的序列化支持。暂时不支持只读表格的反序列化。


2012-4-17
    Table Serialization are functions to serialize/unserialize a table or object (usually, not always, represented as a table), which is to convert it to and from a string representation. This is typically used for display (e.g. debugging) or storing data in a file (e.g. persistence).

    另外,lua和json已经可以很好的配合了,采用json方式的序列化可能是另外一个选择。
参考:

2012-4-18
  评论这张
 
阅读(7568)| 评论(4)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018