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:
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
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:
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
Serializing Lua objects into Lua Code相关推荐
- [Lua语言编程]Lua语言基础知识
文章目录 `Lua` `Lua`语言的起源 `Lua` 特性 `Lua下载` Linux 系统上安装 Mac OS X 系统上安装 Window 系统上安装 `Lua` `Lua`语言语法 `Lua` ...
- Lua之Lua安装与Lua变量-TTLSA(一)
为什么80%的码农都做不了架构师?>>> 公司业务有用到Lua,与nginx结合起来实现高性能的web应用,想去弄懂这方面的知识,就去了解学习了下Lua,欢迎大咔们指教. 1. ...
- Lua基本语法-lua与C#的交互(相当简单详细的例子)
lua脚本 与 C#的交互 本文提供全流程,中文翻译. Chinar坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lua And C# - ...
- lua脚本之lua语言简介以及lua的安装
本博主不擅于进行文字创作,所以,相当一部分文字皆复制于其他博文.还希望能够得到谅解. 一.Lua语言简介 Lua是一个免费的开源软件,可以免费用于科研及商业.Lua具有一个专家团队在维护和升级,其设 ...
- Lua:01---Lua语言介绍、运行Lua程序(lua解释器)
一.Lua语言介绍 Lua语言从一开始就被设计为能与C/C++及其他常用语言开发的软件集成在一起使用的语言,这种设计带来了非常多的好处: 一方面, Lua语言不需要在性能.与三方软件交互等C语言已经非 ...
- PandoraBox登录无法后台,出现/usr/lib/lua/luci/dispatcher.lua:461(2021-12-19亲测)
K2刷了老毛桃的PandoraBox固件,IP无法登录路由器后台,出现:/usr/lib/lua/luci/dispatcher.lua:461: bad argument #1 to 'pairs' ...
- 学习lua第一步-lua解释器luac.exe
从www.lua.org上下载下lua的源码,用vc建个控制台的工程,将src目录下除luac.c外的其他文件复制过来,然后包含进这个工程,编译生成exe,这个就是lua的解释器了. 用法我还没怎么搞 ...
- lua—C/C++lua嵌入式开发
lua-C/C++lua嵌入式开发 一.lua定位--C/C++嵌入式脚本语言 二.数据类型--table 三.协程 下面重点说一下Lua与C/C++之间的交互 [一]基本配置 [二]进行交互 [三] ...
- Lua笔记-关于lua table的C API
//Lua笔记-关于lua table的C API //转载请注明来自yuliying的CSDN博客. //Lua版本5.2 /*相关API: ====lua_createtable 原型: void ...
最新文章
- windows下安装mysql8.0压缩版
- Windows下的cmd小技巧
- ping网关丢包_网络/摄像机丢包的原因分析
- codeforces82 D. Two out of Three(记忆化搜索)
- python自动拨号_Python自动连接ssh的方法
- 佳能打印机g3800如何安装到计算机,佳能Canon PIXMA G3800 驱动
- 牛客网算法工程师能力评估
- 通过汇编程序理解汇编和链接过程
- 单片机交通灯c语言实验报告,模拟交通灯单片机实验报告.doc
- python 图像处理基本操作
- 汉语词性对照表[北大标准/中科院标准]
- 如何增加微信朋友圈分享链接的小图片
- java实现的俄罗斯方块游戏--powered by dustin
- “国防七子”排名:各有所长,报效强国
- stata F值缺失_一文读懂Stata做格兰杰因果检验命令总结
- 非插件修改 WordPress 标签云样式
- 百度小程序api怎么提交?Python推送代码免费分享给大家
- 移动端真机调试--weinre
- 动态规划——背包问题(01背包问题)
- hyperion卫星重访时间_国际资讯|小型雷达卫星的干涉测量技术