Lua序列化方法

lua序列化实现使用的是string.dump (),关于string.dump ()的介绍,lua的API文档中写到

string.dump (function [, strip])

返回一个包含给定函数的二进制表示(二进制块)的字符串,以便稍后对该字符串的加载将返回函数的一个副本(但带有新的upvalues)。如果strip为真值,则二进制表示可能不包含关于函数的所有调试信息,以节省空间。
带有upvalues的函数只保存upvalues的数量。当(重新)加载时,这些upvalues将接收包含nil的新实例。(您可以使用debug库以适合您需要的方式序列化和重新加载函数的upvalue。)

通俗点就是在讲string.dump有两个参数,第一个参数传入序列化的函数名,第二个参数要传入的是boolean值(该值为真,则序列化函数时不会包含函数的调试信息,以节省空间)这个参数为真为假我都没看出什么区别,load序列化之后的函数调用中,debug照样能打印出来,

举个例子

  • 序列化
    使用IO读取一个lua文件存入变量data,然后序列化loadstring之后的函数,伪代码如下:

dumpData=string.dump(loadstring(data))
io.open(path,“wb”):write(dumpData)

  • 反序列化
    上面我们把序列化返回的二进制数据写入文件,下次直接读取二进制数据,再使用loadstring或load方法反序列化成函数(这个我是这么理解的),伪代码如下:

data=io.open(path,“rb”):read("*a")
dumpfunc=loadstring(data)

实际代码演示:
要序列化的文件如下

--[[
ModuleName : dumpfile.lua
Path : E:\SluaNetProtol\src\test\dumpfile.lua
Author : jinbo
CreateTime : 2020-05-15 10:05:02
Description :
--]]

local module={}
function Start()
	print("Dump file Start function Execute")
	print(debug.getinfo(1,"n").name)

end

function Add(a,b)
	print("Input a=",a)
	print("Input b=",b)
	print("return a+b=",a+b)
	return a+b
end

function ShowMsg(msg)
	print(msg)
end

function module.Main()
	print("module.Main is Executed")
end

return module

序列化与反序列化操作代码如下:

--[[
ModuleName : dumpTest.lua
Path : E:\SluaNetProtol\src\test\dumpTest.lua
Author : jinbo
CreateTime : 2020-05-15 10:04:07
Description :
--]]

local file=io.open("E:/SluaNetProtol/src/test/dumpfile.lua","rb")
local data=file:read("*a")
file:close()
local dumpFunc=loadstring(data,"dumpfile.lua")

-----------test Start-----------------------
-- local module=dumpFunc()
-- module.Main()
-----------test End-----------------------

local dumpData=string.dump(dumpFunc,false)
local wfile=io.open("E:/SluaNetProtol/src/test/dumpfile.txt","wb")
wfile:write(dumpData)
wfile:close()

------------Read dumpData and Execute-------------------------

local rfile=io.open("E:/SluaNetProtol/src/test/dumpfile.txt","rb")
local rData=rfile:read("*a")
rfile:close()

local loadFunc=loadstring(rData)
local newEnv={}
setfenv(loadFunc,newEnv)()
setmetatable(newEnv,{__index=_G})

newEnv.Start()
newEnv.Add(2,3)
newEnv.ShowMsg("this is a test function")
print(newEnv.module)

结果显示能够执行反序列化之后的函数:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值