Serializing Lua objects into Lua Code

The following little snippet allows you to ‘pickle’ Lua objects directly into Lua code (with the exception of functions, which are serialized as raw bytecode). Metatable support is on the way, but for now, it should be useful enough.

Example code:

view sourceprint?
01.dofile?"pickle.lua"
02.?
03.users?=?{
04.user1?=?{pass?=?"abcdef",?start?=?10230},
05.user2?=?{pass?=?"cdefba",?start?=?12032}
06.}
07.?
08.userdump?=?pickle.dumps(users)
09.print(userdump)

Outputs

view sourceprint?
01.return?{
02.["user1"]?=?{
03.["pass"]?=?"abcdef",
04.["start"]?=?10230,
05.},
06.["user2"]?=?{
07.["pass"]?=?"cdefba",
08.["start"]?=?12032,
09.},
10.}

Pickle API:

  • pickle.dumps(object) -> String
    Pickles an object and returns it.
  • pickle.dump(object, filename) -> String
    Pickles an object and saves it as :filename, afterwards, returns the dump.
  • pickle.loads(object) -> Lua Object
    Loads a string dump of lua object and returns the object. The returned object will not injected into the global table.
  • pickle.load(filename) -> Lua Object
    Loads a pickled object from a file and returns it. The returned object will not be injected into the global table.

Full Source:

view sourceprint?
01.local?objects?=?{}
02.setmetatable(objects,?{__index={["subset"]=function(object,?proxies)
03.for?_,o in?ipairs(proxies)?do
04.if?object?==?o?then?return?true?end
05.end
06.end}})
07.?
08.function?_pickle(object,?seen,?indent)
09.---if not seen then seen = {} end
10.if?not?indent?then?indent?=?""?end
11.?
12.local?serialize_key?=?function(key)
13.if?type(key)?==?"string"?then
14.return?"[\""..key.."\"]"
15.elseif?type(key)?==?"table"?then
16.return?"[".._pickle(key):gsub("\n"," ").."]"
17.else
18.return?"["..key.."]"
19.end
20.return?key
21.end
22.?
23.local?escape?=?function(o)
24.return?o:gsub("\\","\\\\"):gsub("'","\\'"):gsub('"','\\"')
25.end
26.?
27.---Switch Object type:
28.if?type(object)?==?"table"?then
29.local?serialize?=?"{\n"
30.for?key,?value in pairs(object)?do
31.serialize?=?serialize?..?indent.."\t"?..?serialize_key(key)?..?" = "?..tostring(_pickle(value,?seen,?indent.."\t"))?..?",\n"
32.end
33.serialize?=?serialize?..?indent?..?"}"
34.?
35.return?serialize
36.elseif?type(object)?==?"string"?then
37.return?'"'?..?escape(object)?..?'"'
38.elseif?type(object)?==?"function"?then
39.return?"loadstring([["..string.dump(object).."]])"
40.elseif?objects.subset(object,?{"userdata"})?then
41.return?nil
42.end
43.return?tostring(object)
44.end
45.?
46.pickle?=?{}
47.?
48.function?pickle.dumps(object)
49.return?"return "..?_pickle(object)
50.end
51.?
52.function?pickle.dump(object,?filename)
53.local?dump?=?pickle.dumps(object)
54.local?_file?=?io.open(filename,?"wb")
55._file:write(dump)
56._file:close()
57.return?dump
58.end
59.?
60.function?pickle.loads(object)
61.local?fn?=?loadstring(object)
62.if?fn?then
63.return?fn()
64.end
65.end
66.?
67.function?pickle.load(filename)
68.local?_file?=?io.open(filename,?"rb")
69.local?dump?=?_file:read("*all")
70.local?object?=?pickle.loads(dump)
71._file:close()
72.return?object
73.end

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257337.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257337.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257337.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

布局管理器android,Android課程---布局管理器之相對布局(一)

下面示例的是在父容器里如何設置按鈕的位置,難度:***,重點是找到一個主按鈕,設置它的id,然后根據它來設置其他按鈕在父容器的位置。代碼示例:android:layout_width"match_parent"android:layout_…

【Cocos2d-Js基礎教學 入門目錄】

本教程視地址頻在:九秒課堂 完全免費從接觸Cocos2dx-Js以來,它的綻放的絢麗讓我無法不對它喜歡。我覺得Js在不斷帶給我們驚喜;在開發過程中,會大大提升我們對原型開發的利用率,使用Js語言做游戲開發,使游戲…

Hammer.js移動端觸屏框架的使用

hammer.js是一個多點觸摸手勢庫,能夠為網頁加入Tap、Double Tap、Swipe、Hold、Pinch、Drag等多點觸摸事件,免去自己監聽底層touchstart、touchmove、touchend事件并且寫一大堆判斷邏輯的痛苦。hammer.js不但支持觸摸屏設備的瀏覽器,在桌面瀏…

Android實現筆記本修改功能,安卓12第二個開發者預覽版推出:UI、功能有所改進...

最近谷歌正式推出了Android 12的第二個開發者預覽版,帶來了很多UI和功能上的改進。首先最明顯的變化應該是鎖屏界面和下拉通知欄的音樂播放器。此前這部分UI的配色一直采用的是音樂專輯的主色調,但在Android 12上,這個配色變成了系統的強調色…

Delphi編譯報錯對照表

; not allowed before ‘ELSE’ → ElSE前不允許有“;” ” clause not allowed in OLE automation section → 在OLE自動區段不允許“”子句 ” is not a type identifier → 不是類型標識符 ” not previously declared as a PROPERTY → 前面沒有說明PROPERTY ‘GOTO ‘ lea…

C語言中Union類型的使用方法

轉自:http://blog.csdn.net/feimor/article/details/6858103 使用C語言時,常常使用struct,對于union類型卻幾乎沒有用過,只知道它是聯合類型,各字段共享一塊內存,實際應用中卻不知道它的具體用途。 今天讀《…

android 點對點語音,使用Android SIP Stack進行點對點SIP呼叫?

我一直被困在同樣的問題上.如果你可以在沒有android sip api的情況下制作它,你可以查看rtp api,它為你提供了一些較低級別的工具來制作P2P VOIP應用程序,而無需服務器.To support audio conferencing and similar usages, you need toinstantiate two classes as endpoints for…

拓撲排序

用兩種方式來實現 1、 深度優先搜索(DFS) 對有向圖采取深度優先搜索,并且在postVist處,打印所訪問的節點。最后打印出的字符序列的反序列正好滿足拓撲排序。(可以在postVist()方法中&#xff0c…

阿里啟動NASA計劃創造新經濟核心科技

本文講的是阿里啟動"NASA"計劃創造新經濟核心科技【IT168 資訊】2017年3月9日,阿里巴巴集團在杭州召開首屆技術大會,動員全球兩萬多名科學家和工程師投身“新技術戰略”。會議透露,阿里巴巴正在啟動一項代號“NASA”的計劃&#xf…

ORACLE創建表空間和用戶

--表空間 CREATE TABLESPACE sdt DATAFILE F:\tablespace\demo size 800M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; --索引表空間 CREATE TABLESPACE sdt_Index DATAFILE F:\tablespace\demo size 512M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AU…

PHP-CGI, FastCGI, PHP-FPM的關系和區別

Web server(apache, nginx) 接受到一個php請求后要解析php文件, 怎么解析呢, web server是C語言寫的, 所以需要一個協議, 一個php解釋器, 也就是CGI. FastCGI是用來提高CGI性能的, 可以說是CGI的升級版. CGI每當一個請求過來都要開啟一個進程, 訪問結束再關閉一個進程, 太累. F…

android 6關閉防火墻,安卓手機如何關閉防火墻

我的安卓手機不想使用防火墻了!該如何關閉呢?下面由小編給你做出詳細的安卓手機關閉防火墻介紹!希望對你有幫助!安卓手機關閉防火墻方法一1、如果該防火墻不是系統自帶的,是你下載安裝的,就直接在設置選項中,選擇應用程序--管理應用程序&…

Powershell命令中的 CommonParameters是指什么

因為在命令中經常遇到這個參數,后來找了一下,有一個微軟的官方文檔,就不翻譯了,英文好的自己讀吧。https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_commonparameters?viewpowershel…

java日志之slf4j與logback簡單使用

最近在開發遇到日志是使用slf4j與logback.xml的配置,所以就記錄下來了。 1、導入這幾個jar包: Logback 分為三個模塊:logback-core,logback-classic,logback-access logback-core 是核心; logback-classic …

android one x3怎么樣,618旗艦手機怎么選,看完這篇文章,你就會知道

轉眼間,2021年即將過半,一年一度的年中購物狂歡節618就要到來了。我已經迫不及待了。畢竟在618年中大促的時候,各家廠商都有力度非常大的活動。而且也有很多小伙伴一直在觀望,想要在618的時候給自己換一款手機。說實話&#xff0c…

字符設備驅動程序框架

via:http://blog.chinaunix.net/uid-20672257-id-3142809.html 1、寫出open、write函數 2、告訴內核 1)、定義一個struct file_operations結構并填充好 static struct file_operations first_drv_fops {.owner THIS_MODULE, /* 這是一個宏&…

華為鴻蒙與magic,如果榮耀Magic3搭載了屏下鏡頭和鴻蒙系統,你會做第一批嗎?...

華為榮耀在目前的手機市場中,榮耀手機的人氣還是蠻高的,從高端旗艦市場到中低端市場,我們都能夠看到榮耀手機的蹤影,這已經可以代表榮耀手機的優勢了。要知道華為榮耀這兩年的發展速度非常快,產品的布局速度也是如此&a…

第十九章 我國農村資金籌集

農村改革解說(專著)第十九章 第十九章 我國農村資金籌集 1、農村公共事業統籌經費怎樣確定? 總的原則是:制止對農民的不合理攤派,減輕農民的額外負擔,保證農村合理的公共事業經費。具體要求如下&#xff1a…

兩個Python web框架:Django Tornado比較

就是說它作為 web 框架比 Django 簡單,又支援異步 IO,且更不需要前端的 webserver ? 我已經混亂了, Tornado是 Nginx、Django、Node.js 的結合體?又或是 Nginx * 20% Django * 40% Node.js * 40% ?你需要搞清楚幾個…

廣義動量定理之速度V的應用分析

廣義動量定理之速度V的應用分析 從廣義動量定理FαtnmV的角度說,改變速度V,就可以改變成果nmV。速度派以改變速度V作為其主要目的。 速度V應用于兵貴神速 理論簡介:三國時期曹操的謀士郭嘉說:“兵貴神速”。 孫子在九地篇中說“兵…