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 == 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相关推荐

  1. [Lua语言编程]Lua语言基础知识

    文章目录 `Lua` `Lua`语言的起源 `Lua` 特性 `Lua下载` Linux 系统上安装 Mac OS X 系统上安装 Window 系统上安装 `Lua` `Lua`语言语法 `Lua` ...

  2. Lua之Lua安装与Lua变量-TTLSA(一)

    为什么80%的码农都做不了架构师?>>>    公司业务有用到Lua,与nginx结合起来实现高性能的web应用,想去弄懂这方面的知识,就去了解学习了下Lua,欢迎大咔们指教. 1. ...

  3. Lua基本语法-lua与C#的交互(相当简单详细的例子)

    lua脚本 与 C#的交互 本文提供全流程,中文翻译. Chinar坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lua And C# - ...

  4. lua脚本之lua语言简介以及lua的安装

    本博主不擅于进行文字创作,所以,相当一部分文字皆复制于其他博文.还希望能够得到谅解.  一.Lua语言简介 Lua是一个免费的开源软件,可以免费用于科研及商业.Lua具有一个专家团队在维护和升级,其设 ...

  5. Lua:01---Lua语言介绍、运行Lua程序(lua解释器)

    一.Lua语言介绍 Lua语言从一开始就被设计为能与C/C++及其他常用语言开发的软件集成在一起使用的语言,这种设计带来了非常多的好处: 一方面, Lua语言不需要在性能.与三方软件交互等C语言已经非 ...

  6. 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' ...

  7. 学习lua第一步-lua解释器luac.exe

    从www.lua.org上下载下lua的源码,用vc建个控制台的工程,将src目录下除luac.c外的其他文件复制过来,然后包含进这个工程,编译生成exe,这个就是lua的解释器了. 用法我还没怎么搞 ...

  8. lua—C/C++lua嵌入式开发

    lua-C/C++lua嵌入式开发 一.lua定位--C/C++嵌入式脚本语言 二.数据类型--table 三.协程 下面重点说一下Lua与C/C++之间的交互 [一]基本配置 [二]进行交互 [三] ...

  9. Lua笔记-关于lua table的C API

    //Lua笔记-关于lua table的C API //转载请注明来自yuliying的CSDN博客. //Lua版本5.2 /*相关API: ====lua_createtable 原型: void ...

最新文章

  1. windows下安装mysql8.0压缩版
  2. Windows下的cmd小技巧
  3. ping网关丢包_网络/摄像机丢包的原因分析
  4. codeforces82 D. Two out of Three(记忆化搜索)
  5. python自动拨号_Python自动连接ssh的方法
  6. 佳能打印机g3800如何安装到计算机,佳能Canon PIXMA G3800 驱动
  7. 牛客网算法工程师能力评估
  8. 通过汇编程序理解汇编和链接过程
  9. 单片机交通灯c语言实验报告,模拟交通灯单片机实验报告.doc
  10. python 图像处理基本操作
  11. 汉语词性对照表[北大标准/中科院标准]
  12. 如何增加微信朋友圈分享链接的小图片
  13. java实现的俄罗斯方块游戏--powered by dustin
  14. “国防七子”排名:各有所长,报效强国
  15. stata F值缺失_一文读懂Stata做格兰杰因果检验命令总结
  16. 非插件修改 WordPress 标签云样式
  17. 百度小程序api怎么提交?Python推送代码免费分享给大家
  18. 移动端真机调试--weinre
  19. 动态规划——背包问题(01背包问题)
  20. hyperion卫星重访时间_国际资讯|小型雷达卫星的干涉测量技术

热门文章

  1. php截取字符串函数 左右,php截取中文字符串函数的技巧
  2. GPU Gems1 - 18 空间BRDF(Spatial BRDFs)
  3. 利用matlab提取中心线
  4. 在linux设置回收站 - 防止失误操作造成数据清空,并定期清理
  5. 在线课程学习、科研科技视频网站
  6. Object 及toString() 方法的重写
  7. Python3 matplotlib的绘图函数subplot()简介
  8. 51Nod 蜥蜴和地下室(搜索)
  9. Python:eval的妙用和滥用
  10. 使用 vue-cli 开发多页应用