2012-02-09 2 views

ответ

3

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

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

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

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

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

3

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

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

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

+0

+1 И не только ссылки на функции, но и дескрипторы файлов, сокеты и внешние состояния в пределах различных функций C. – BMitch

+0

Извините, что выкапываете старый вопрос, но как хранятся ссылки на C-функции в Lua? В книге PiL «pushcfunction» подталкивает значение функции типа ». C указатели функций по существу являются просто регулярными ячейками памяти, поэтому я бы предположил, что тип функции Lua не должен быть намного больше, чем lightuserdata. И поскольку указатели func указывают на сегмент .text, я надеюсь, что они не изменятся, по крайней мере, на одной и той же архитектуре, так почему это будет проблемой для сериализации? (или, я думаю, мой вопрос заключается в том, что указатели функции остаются такими же или они каким-то образом меняются?) – mtsvetkov

+0

@ mtsvetkov: Практически каждая современная ОС будет рандомизировать местоположение памяти, где загружается исполняемый код. Поэтому нет причин ожидать, что указатель функции будет находиться в одном и том же месте на двух отдельных исполнениях одной и той же программы, даже на том же компьютере. Опять же, нет, это не сработает. –

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. 

Надеется, что это помогает. Удачи!

Смежные вопросы