李程站 发表于 2013-2-4 02:16:44

关于LUA程序设计对象序列化学习笔记

关于LUA程序设计对象序列化学习笔记是本文要介绍的内容,主要是来学习LUA中对象的序列化,具体内容的详解来看本文。
通常需要序列化一些数据,也就是将数据转换为一个字节流或字符流,然后就可以将其方便的持久化。文本序列化可选择的格式非常多:SOAP、Json甚至自定义xml等,不过lua脚本也是一个不错的选择方案。
本文在参考《Lua程序设计(第2版)》简体中文版 详解LUA脚本语言之数据文件与持久化 基础上给出下面的实现。要注意的是该实现只能针对无环的table,并且不能对function、thread、userdata这三种类型进行序列化和反序列化。为了防止序列化后数据过大,也没有做精细的排版控制。

[*]function serialize(obj)
[*]    local lua = ""
[*]    local t = type(obj)
[*]    if t == "number" then
[*]      lualua = lua .. obj
[*]    elseif t == "boolean" then
[*]      lualua = lua .. tostring(obj)
[*]    elseif t == "string" then
[*]      lualua = lua .. string.format("%q", obj)
[*]    elseif t == "table" then
[*]      lualua = lua .. "{\n"
[*]      for k, v in pairs(obj) do
[*]            lualua = 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
[*]                lualua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ",\n"
[*]            end
[*]      end
[*]      lualua = 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, = 2, ["t"] = {1, 2, 3}}
[*]print(serialize(unserialize(1)))
[*]print(serialize(unserialize(serialize(data))))
小结:关于LUA程序设计对象序列化学习笔记的内容介绍完了,希望通过本文的学习能对你有所帮助!
【编辑推荐】

[*]Lua程序设计语言入门学习
[*]魔兽世界超级助手Lua脚本语言
[*]LUA学习笔记:魔兽世界自定义界面插件
[*]如何在CEGUI中使用Lua脚本入门学习
[*]详解LUA特性之私有性Privacy学习笔记
[*]解析LUA下载和测试编程环境学习教程
页: [1]
查看完整版本: 关于LUA程序设计对象序列化学习笔记