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)

结果显示能够执行反序列化之后的函数:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C#中Serializable序列化实例

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    bering
  • Python使用xadmin注意事项

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    bering
  • 使用Unity3D提取王者荣耀英雄模型 VR资源

    我玩儿王者荣耀的时候,看到大乔的建模非常漂亮,于是想提取出来研究一下。搜索网上发现只有在各个网站出售的提取好了的模型,需要用各种币购买,以及注册等非常麻烦。所...

    bering
  • 有点夸张、有点扭曲!速览这些GAN如何夸张漫画化人脸!

    1 (2018-07-24) Unpaired Photo-to-Caricature Translation on Faces in the Wild

    公众号机器学习与生成对抗网络
  • AI成为披萨师:MIT利用AI制作披萨食谱

    AI可以帮助放射科医师诊断肺炎,预测您的音乐品味,甚至可以预测余震。而它也可以是一个非常强大的披萨师。

    AiTechYun
  • 卖了43.2万美元的AI画作,其实是借鉴程序员代码的“山寨货”?

    10 月 25 日,佳士得进行了一次不同寻常的拍卖,拍卖品是一幅镶着金色画框的画作,名为《艾德蒙·贝拉米的画像》(Portrait of Edmond Bela...

    AI科技大本营
  • 腾讯云服务器生成免费快照过程记录

    魏艾斯博客www.vpsss.net
  • 腾讯云服务器生成免费快照过程记录

    腾讯云服务器目前提供免费的网站快照,这点相对于国内同行来说也是腾讯云的一个亮点。毕竟今时今日云服务器上面免费的东西不多了,人家也是真金白银运营的服务器。相对于阿...

    魏艾斯博客www.vpsss.net
  • 流水线的性能指标

    其中,n代表完成指令的数量,k代表指令执行过程中被划分的段数。\(\Delta t\)是一个CPU周期。

    KevinBruce
  • 美国“存储Twitter”,中国也要给博文“建档”

    这个项目的名字有些让人费解,国家图书馆与互联网信息怎么会联系在一起,还要战略保存呢?这要从图书馆的变迁说起。

    罗超频道

扫码关注云+社区

领取腾讯云代金券