Например, у меня есть доверенный клиент и сервер. Клиент хочет выполнить произвольный код на сервере. Можно ли это сделать с помощью RemoteActor (сериализовать функцию и отправить ее по сети, десериализировать ее и выполнить)?Есть ли способ в scala для выполнения произвольного кода на удаленном узле с помощью RemoteActor?
ответ
В настоящее время нет. Сериализация функции означает сохранение ее полей в потоке вывода объекта и десериализация ее означает чтение объекта функции из входного потока объекта в другом месте. Десериализация предполагает, что класс объекта, который считывается из входного потока объекта, известен JVM. Помните - функции - это только объекты за сценой.
В этом случае сервер не знает конкретного конкретного класса объекта функции, который вы сериализуете, возможно, что он реализует интерфейс Function
. Чтобы поддерживать такую функциональность, вам нужно найти файл класса соответствующей функции, отправить ее на сервер и загрузить ее на сервере с помощью настраиваемого classloader. Затем, если объект имеет какое-либо состояние, вы можете сериализовать объект на клиенте, отправить его по сети и десериализовать его на сервере. Только тогда вы сможете использовать его методы. Предполагая, что ваши объекты функции не имеют состояния, что обычно происходит, вы можете пропустить шаг сериализации/десериализации.
EDIT:
Помните также, что функции могут внутренне хранить ссылки на их призывающих среде. Это означает, что вы могли бы в конечном итоге сериализации окружение функции объекта вместе с ним, который потенциально может быть вся ваша данные программы ..
Вот example использования URLClassLoader с удаленными участниками, принести классы через http от клиента и выполнить общие вычисления на сервере.
Вы также можете быть заинтересованы в HotSwap technique применительно к serializable Akka Actors.
Но сериализация сохранит только значения поля функции в потоке. Переопределение метода apply применяется для анонимного класса, реализующего интерфейс 'Function'. Фактический код в переопределенном методе 'apply' анонимного класса не становится сериализованным, если мое понимание верное. Правильно? В этом случае, как удаленный актер на сервере узнает о теле метода «apply», который известен только на клиенте? – axel22
Согласны, нашли тему по этой теме: http://scala-programming-language.1934581.n4.nabble.com/Passing-functions-to-remote-actor-td2991157.html –