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