序列化.jpg
前言#
今天我們來一起看一個(gè)神奇的函數(shù)诡渴,這個(gè)函數(shù)乍一看根本不知道是干嘛用的竿音,仔細(xì)一看還是不明白娘摔,在查詢了多方資料以后終于命名明白他的用途窄坦,這里不得不提到一個(gè)詞——序列化。
序列化 (Serialization)將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程凳寺。在序列化期間鸭津,對象將其當(dāng)前狀態(tài)寫入到臨時(shí)或持久性存儲區(qū)。以后肠缨,可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài)逆趋,重新創(chuàng)建該對象。
這個(gè)詞聽起來就高大上晒奕,但是我們今天的函數(shù)用起來卻非常簡單闻书,就是調(diào)用函數(shù)stringdump()
將其它函數(shù)序列化,然后函數(shù)就可以傳遞了脑慧,還把函數(shù)傳遞到另一個(gè)進(jìn)程惠窄,甚至存儲到文件中都是可以的。
內(nèi)容#
string.dump()##
- 原型:string.dump (function)
- 解釋:返回一個(gè)包含所給函數(shù)二進(jìn)制描述的字符串漾橙,以至于在此之后可以使用函數(shù)
loadstring()
利用所得到的字符串來返回一個(gè)函數(shù)拷貝杆融,需要注意的是函數(shù)只能是Lua函數(shù)并且沒有upvalues(外部局部變量)。
Usage##
- 首先新建一個(gè)文件將文件命名為dumptest.lua然后辨析額如下代碼:
--自定義一個(gè)函數(shù)
function custom_func(num1, num2)
local ret = num1 + num2;
print("\nnum1 = "..num1)
print("num2 = "..num2)
print("num1 + num2 = "..ret)
end
-- 將函數(shù)序列化
local func_content = string.dump(custom_func)
print("\nfunc_content = "..func_content)
-- 將轉(zhuǎn)化后的字符串寫入文件
local outfile = io.open("dumptest.txt", "w")
local outnum = outfile:write(func_content)
outfile:close()
-- 從文件總讀取內(nèi)容
local infile = io.open("dumptest.txt", "r")
local incontent = infile:read("*a")
infile:close()
print("\ninput content is "..incontent)
-- 加載函數(shù)
local myfunc = loadstring(incontent)
-- 執(zhí)行函數(shù)
myfunc(1, 1)
myfunc(3, 6)
-- 輸出這個(gè)幸福的七月七
myfunc("7" ,".7")
print("\nthis is a happy day!")
print(os.date())
- 運(yùn)行結(jié)果:
string_dump.png
總結(jié)#
- 看了這個(gè)函數(shù)是不是有種非常神奇的感覺霜运,原來傳說中的序列化可以離我們這么近脾歇。
- 在調(diào)用了函數(shù)
string.dump()
之后函數(shù)custom_func()
被轉(zhuǎn)化成字符串保存在文件中,可以在使用時(shí)再取出來淘捡。 - 這個(gè)函數(shù)一般寫邏輯代碼應(yīng)該用不到藕各,更多的是做框架的時(shí)候用的功能,進(jìn)過序列化的函數(shù)可以通過網(wǎng)絡(luò)傳送焦除、轉(zhuǎn)化激况、再使用。
- 好了,在這個(gè)幸福的日子里乌逐,祝你節(jié)日快樂吧竭讳,別在這搬磚了,抓緊撩妹去吧浙踢。