關(guān)于LUA程序設(shè)計(jì)對(duì)象序列化學(xué)習(xí)筆記
關(guān)于LUA程序設(shè)計(jì)對(duì)象序列化學(xué)習(xí)筆記是本文要介紹的內(nèi)容,主要是來(lái)學(xué)習(xí)LUA中對(duì)象的序列化,具體內(nèi)容的詳解來(lái)看本文。
通常需要序列化一些數(shù)據(jù),也就是將數(shù)據(jù)轉(zhuǎn)換為一個(gè)字節(jié)流或字符流,然后就可以將其方便的持久化。文本序列化可選擇的格式非常多:SOAP、Json甚至自定義xml等,不過(guò)lua腳本也是一個(gè)不錯(cuò)的選擇方案。
本文在參考《Lua程序設(shè)計(jì)(第2版)》簡(jiǎn)體中文版 詳解LUA腳本語(yǔ)言之?dāng)?shù)據(jù)文件與持久化 基礎(chǔ)上給出下面的實(shí)現(xiàn)。要注意的是該實(shí)現(xiàn)只能針對(duì)無(wú)環(huán)的table,并且不能對(duì)function、thread、userdata這三種類型進(jìn)行序列化和反序列化。為了防止序列化后數(shù)據(jù)過(guò)大,也沒(méi)有做精細(xì)的排版控制。
- 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] = 1, [2] = 2, ["t"] = {1, 2, 3}}
 - print(serialize(unserialize(1)))
 - print(serialize(unserialize(serialize(data))))
 
小結(jié):關(guān)于LUA程序設(shè)計(jì)對(duì)象序列化學(xué)習(xí)筆記的內(nèi)容介紹完了,希望通過(guò)本文的學(xué)習(xí)能對(duì)你有所幫助!















 
 
 
 
 
 
 