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.mzph.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应用于兵贵神速 理论简介:三国时期曹操的谋士郭嘉说:“兵贵神速”。 孙子在九地篇中说“兵…