2012-02-09 60 views

回答

3

根據您的需求,您有多種選擇。您可以嘗試使用Pluto Library。這是一個「重權重」序列化庫:

冥王星是一個庫,它允許用戶以「的Lua宇宙」的任意大的部分寫入到平面文件,並在以後讀回相同或不同的Lua宇宙。對象引用被適當地處理,使得該文件包含重新創建所述對象所需的一切。

你也可以嘗試lper,它採用Linux Persistent Memory

注意,您有發送自定義的C函數和用戶數據的問題...

如果你其實並不需要發送整個lua_State(爲什麼你需要嗎?),你可以去看看在Lua-users Wiki的TableSerialization頁面。也許你可以通過發送包含你需要的整個「狀態」的序列化(可能很大)的Lua表來解決你的問題。

3

序列化完整的lua_State是根本不可能的。畢竟,即使您可以傳輸存儲在一個存儲器中的內存,lua_State也會附帶許多C函數。你怎麼能序列化網絡中的其中一個?

你可以期望的最好的方式是嘗試記住你在一個Lua州做了什麼,並告訴整個網絡上的程序也這樣做。這將需要編寫一個Lua界面的抽象概念,您可以將其稱爲,而不是Lua界面的。它會報告你對網絡程序採取的每一個行動。文件加載也必須將該文件傳輸到聯網的程序。

基本上,你必須採取每個Lua函數,並寫一個新版本,它調用舊的並告訴聯網的程序你在做什麼。

+0

+1不僅僅是函數引用,還有各種C函數中的文件句柄,套接字和外部狀態。 – BMitch 2012-02-09 23:21:11

+0

對不起正在挖掘一個老問題,但如何將C函數引用存儲在Lua中? PiL書說'pushcfunction'「推入一個類型函數的值」。 C函數指針本質上只是規則的內存位置,所以我會想象Lua函數類型不應該超過lightuserdata。由於func指針指向.text段,我希望它們至少在相同的架構上不會改變,所以爲什麼這會成爲序列化的問題? (或者我想我的問題是函數指針保持不變或者它們以某種方式變化?) – mtsvetkov 2013-02-26 00:38:58

+0

@mtsvetkov:幾乎每個現代操作系統都會隨機化可執行代碼加載的內存位置。所以沒有理由期望函數指針在同一個程序的兩個獨立執行中處於相同位置,即使在同一臺計算機上。所以再次,不,這不起作用。 – 2013-02-26 00:53:30

0

嗯,我不知道如何將實際的lua_state傳遞給套接字。也許你可以提取lua_state中包含的信息,然後通過套接字傳遞提取的信息?

std::string name(lua_tostring(L,1)); 
int age = lua_tonumber(L,2); 
//then send name and string over the socket somehow... 

如果你有從,你想轉發到Lua插座任何迴應只是像做

//get response from socket and push response to lua 
lua_pushnumber(L, response); 
return 1; //indicate how arguments you are returning. 

希望它能幫助。祝你好運!