我需要使用C ++中的套接字将lua_state发送到服务器。我如何序列化lua_State以便可以通过网络发送?
答案 0 :(得分:3)
从根本上不可能序列化一个完整的lua_State
。毕竟,即使您可以传输存储在其中的内存,lua_State
也会附加许多C函数。你如何通过网络序列化其中一个?
你可以期待的最好的方法是尝试记住你在一个Lua状态下做了什么,并通过网络告诉程序也这样做。这将需要编写Lua接口的抽象,您可以将其称为Lua接口的而不是。它会报告您对联网计划采取的每项操作。文件加载还必须将该文件传输到联网程序。
基本上,你必须采用每个Lua函数并编写一个新版本的函数来调用旧函数并告诉联网程序你正在做什么。
答案 1 :(得分:3)
根据您的需要,您有多种选择。您可以尝试使用Pluto Library。它是一个“重量级”序列化库:
Pluto是一个库,它允许用户将“Lua universe”的任意大部分写入平面文件,然后将它们读回相同或不同的Lua Universe。适当处理对象引用,以便该文件包含重新创建相关对象所需的所有内容。
您也可以尝试使用lper的Linux Persistent Memory。
请注意,将在发送自定义C函数和用户数据方面遇到问题...
如果您实际上不需要发送整个lua_State
(为什么需要发送?),您可以查看Lua-users Wiki上的TableSerialization页面。也许你可以通过发送包含你需要的整个“状态”的序列化(可能很大)的Lua表来解决你的问题。
答案 2 :(得分: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.
希望它有所帮助。祝你好运!