關于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] = 1, [2] = 2, ["t"] = {1, 2, 3}}
- print(serialize(unserialize(1)))
- print(serialize(unserialize(serialize(data))))
小結:關于LUA程序設計對象序列化學習筆記的內容介紹完了,希望通過本文的學習能對你有所幫助!