2012-02-09 59 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. 

希望它能帮助。祝你好运!