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 == 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

时间: 2024-10-31 17:13:42

Serializing Lua objects into Lua Code的相关文章

Lua学习---编译生成lua和luac

众所周知,Lua是一种强大的脚本语言,并且这种语言是用C语言实现的.为什么要学习这门语言?因为它可以增强我看C语言代码的功底. 我下的Lua版本是Lua5.3,关于Lua5.3的简介如下: http://www.runoob.com/manual/lua53doc/ Lua语言源码发布网站如下:http://www.lua.org/ftp/ 下好了,该怎么编译?打开Makefile,于是看到关键的一行: PLATS= aix bsd c89 freebsd generic linux macos

C语言中通过LUA API访问LUA脚本变量的简单例子_Lua

1.简介 这一节介绍一些关于栈操作.数据类型判断的LUA API,可以使用这些函数获得脚本中的变量值. 2.步骤 编写 test01.lua 脚本,在VS2003中创建控制台C++程序并正确配置,执行查看结果,修改test02.lua脚本后查看执行结果 3.测试脚本 以下是用来测试的lua脚本 复制代码 代码如下: function plustwo(x)          local a = 2;          return x+a; end; rows = 6; cols = plustw

Lua precompiled code

使用luac或者string.dump函数可以将Lua脚本编译成二进制格式, 编译后的代码同样可以使用lua运行. 预编译代码(二进制格式)加载速度比文本快, 但是文件可能更大, 同时二进制格式可以对代码起到一定的保护作用, 因为文本很容易暴露或被修改. # vi test.lua local a=1 function f() a=a+1 return a end for i=1,20 do print(f()) end 使用luac把脚本转换成二进制编码 # luac -o ./test.lc

Embedding Lua, in Scala, using Java(转)

LuaJ I was reading over the list of features that CurioDB lacks compared to Redis , that I'd previously documented. It contained the item "no Lua scripting", which I'd written confidently at the time, certain that I wouldn't possibly be able to

Lua 5.1 Use luadbi connect to postgresql

使用Lua 连接postgresql的驱动很多, 前面我介绍了一下luasql, luapgsql的使用, 其中luasql由于不支持prepared sql, 所以在大量SQL请求的情况下, 效率会比较低. luapgsql则支持prepared sql, 效率接近pgbench, 还是不错的. 本文将介绍一下luadbi这个驱动, 它同样支持多个数据库种类, 其中postgresql这个也是使用libpq来支持的.  luadbi这个0.5版本驱动在5.1下面可以正常使用, 但是Lua 5.

Lua中操作字符串的基本方法整理

  这篇文章主要介绍了Lua中操作字符串的基本方法整理,是Lua入门学习中的基础知识,需要的朋友可以参考下 字符串是一个字符序列,以及控制字符.字符串可以用三种形式被初始化,其中包括: 单引号之间的字符 双引号之间的字符 [] 之间的字符[[和]] 对于上述三种形式的一个例子如下所示. 代码如下: string1 = "Lua" print(""String 1 is"",string1) string2 = 'Tutorial' print(&

《Lua游戏AI开发指南》一2.10 智能体的属性

2.10 智能体的属性 现在已经可以创建智能体了,我们回过头来看看智能体都有哪些属性,以及它们的意义是什么. 2.10.1 朝向 每当需要返回智能体的朝向时,最简单的方法是使用前向向量,它通常代表了智能体的运动方向.朝向的左向量和上向量也可以访问到.每当你需要改变智能体的方向时,只需简单地设置它的前向向量. 1.前向轴 为了获取和设置智能体的前向向量,我们可以使用内建的GetForward和SetForward辅助函数. local forwardVector = agent:GetForwar

第一个Cocos2d-x Lua游戏

我们的编写的第一个Cocos2d-x Lua程序,命名为HelloLua,从该工程开始学习其它的内容.创建工程我们创建Cocos2d-x Lua工程可以通过Cocos2d-x提供的命令工具cocos实现,但这种方式不能与Cocos Code IDE集成开发工具很好地集成,不便于程序编写和调试.由于Cocos Code IDE工具是Cocos2d-x开发的专门为Cocos2d-JS和Cocos2d-x Lua开发设计的,因此使用Cocos Code IDE工具很方便创建Cocos2d-x Lua工

Windows下使用luaDoc给lua生成文档

 首先需要安装lua,Windows下自然是安装Lua For Windows咯,下载地址:http://code.google.com/p/luaforwindows/安装以后它已经包含了luadoc,所以无需我们再去下载,如果非要去下载的话,那么下载地址是:http://luadoc.luaforge.net/. 然后,我们需要准备一个批处理文件,叫啥名字无所谓,我是取名叫做buildDoc.bat的,我用doxygen的时候也是叫这个名字的,以下是批处理文件的内容: @echo onlua