C++ 将lua_状态序列化为通过网络发送

C++ 将lua_状态序列化为通过网络发送,c++,networking,lua,serializable,C++,Networking,Lua,Serializable,我需要使用C++中的套接字向服务器发送lua_状态。如何序列化lua_状态以便通过网络发送?序列化完整的lua_状态基本上是不可能的。毕竟,即使您可以传输存储在其中的内存,lua_States也有许多附加的C函数。如何通过网络序列化其中一个 你所能期望的最好的方法是试着记住你在一个Lua州所做的事情,并通过网络告诉程序也这样做。这将需要编写Lua接口的抽象,您调用它而不是Lua接口。它将向网络计划报告您采取的每一项行动。文件加载还必须将该文件传输到联网程序 基本上,你必须接受每一个Lua函数,并

我需要使用C++中的套接字向服务器发送lua_状态。如何序列化lua_状态以便通过网络发送?

序列化完整的
lua_状态
基本上是不可能的。毕竟,即使您可以传输存储在其中的内存,
lua_State
s也有许多附加的C函数。如何通过网络序列化其中一个

你所能期望的最好的方法是试着记住你在一个Lua州所做的事情,并通过网络告诉程序也这样做。这将需要编写Lua接口的抽象,您调用它而不是Lua接口。它将向网络计划报告您采取的每一项行动。文件加载还必须将该文件传输到联网程序


基本上,你必须接受每一个Lua函数,并编写一个新版本的函数来调用旧函数,并告诉网络程序你在做什么。

嗯,我不知道如何通过套接字传递实际的Lua\u状态。也许您可以提取lua_状态中包含的信息,然后通过套接字传递提取的信息

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.

希望能有帮助。祝你好运

根据您的需要,您有几种选择。您可以尝试使用。它是一个“重量级”序列化库:

Pluto是一个库,允许用户将“Lua宇宙”的任意大部分写入平面文件,然后将其读回相同或不同的Lua宇宙。对象引用得到了适当的处理,因此文件包含了重新创建相关对象所需的所有内容

您也可以尝试使用

请注意,您在发送自定义C函数和用户数据时会遇到问题


如果您实际上不需要发送整个
lua_State
(为什么需要这样做?),您可以查看lua用户Wiki上的页面。也许您可以通过发送包含您所需的整个“状态”的序列化(可能较大)Lua表来解决问题。

+1不仅包括函数引用,还包括各种C函数中的文件句柄、套接字和外部状态。很抱歉,我要问一个老问题,C函数引用是如何存储在Lua中的?PiL手册上说,
pushcfunction
“推送函数类型的值”。C函数指针本质上只是常规内存位置,因此我认为Lua函数类型不应该比lightuserdata多太多。既然func指针指向.text段,我希望它们至少在相同的体系结构上不会改变,那为什么序列化会有问题呢?(或者我想我的问题是,函数指针是保持不变还是有所不同?@mtsvetkov:几乎每个现代操作系统都会随机化加载可执行代码的内存位置。因此,即使在同一台计算机上,在同一程序的两次单独执行中,也没有理由期望函数指针位于同一位置。所以再说一遍,不,这不起作用。