Сериализация lua_State для отправки по сети - PullRequest
4 голосов
/ 09 февраля 2012

Мне нужно отправить lua_state на сервер с помощью сокетов в C ++. Как я могу сериализовать lua_State, чтобы его можно было отправлять по сети?

Ответы [ 3 ]

3 голосов
/ 09 февраля 2012

В зависимости от ваших потребностей, у вас есть несколько вариантов.Вы можете попробовать использовать библиотеку Плутона .Это «тяжеловесная» библиотека сериализации:

Pluto - это библиотека, которая позволяет пользователям записывать произвольно большие части «вселенной Lua» в плоский файл, а затем читать их обратно вта же или другая вселенная Lua.Ссылки на объекты обрабатываются соответствующим образом, так что файл содержит все необходимое для воссоздания рассматриваемых объектов.

Вы также можете попробовать lper , который использует Постоянная память Linux .

Обратите внимание, что у вас будут проблемы с отправкой пользовательских функций C и пользовательских данных ...

Если вам на самом деле не нужно отправлять все lua_State (зачем вам это нужно?), вы можете взглянуть на страницу TableSerialization в Lua-users Wiki.Возможно, вы сможете решить свою проблему, отправив сериализованные (возможно большие) таблицы Lua, содержащие все необходимое вам «состояние».

3 голосов
/ 09 февраля 2012

Сериализация полного lua_State принципиально невозможна.В конце концов, даже если бы вы могли передавать память, хранящуюся в одном, lua_State s имеет много функций С, связанных с ними.Как вы могли бы сериализовать один из них по сети?

Лучшее, на что вы можете надеяться, это попытаться вспомнить, что вы сделали в одном состоянии Lua, и сказать программе через сеть сделать то же самое.Это потребует написания абстракции интерфейса Lua, который вы называете вместо интерфейса Lua.Он сообщит о каждом действии, которое вы предпримете для сетевой программы.Загрузка файла также должна была бы передать этот файл сетевой программе.

По сути, вам нужно взять каждую функцию Lua и написать новую версию, которая вызывает старую и сообщает сетевой программе, что выделает.

0 голосов
/ 09 февраля 2012

Ну, я не знаю, как бы вы передавали фактическое значение 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.

Надеюсь, это поможет. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...