2015-03-16 4 views
3

Я возился с Java-сериализацией лямбда.Сериализация lambda

У меня есть два полностью отдельных проектов, в которых есть один класс.

Проект 1:

class TestMain { 

    public static void main(String[] args) { 
     Runnable r = (Runnable & Serializable)() -> {}; 

     // Serialize r to C:/file.ser; 
    } 
} 

Проект 2:

class TestMain2 { 

    public static void main(String[] args) { 
     // Deserialize C:/file.ser to runnable; 
    } 
} 

Однако при попытке десериализации работоспособным, он выбрасывает исключение заявив, что не может найти TestMain

. ...Я могу каким-то образом избежать этого?

+0

общая плохая идея. не делай этого. – iced

ответ

5

Решение должно включать TestMain на пути к классу при десериализации.

лямбда неявно зависит от внешнего класса, в котором она объявлена.

Кроме того, Java Tutorial говорит, что это:

Однако, как внутренние классы, сериализации лямбда-выражений настоятельно не рекомендуется.


Кроме того ..., как @ Тим указывает ... даже если не нужен файл TestMain.class, вы по-прежнему нужен файл TestMain$xxx.class, содержащий код лямбда в.

+1

Bummer, это отвечает на мой вопрос, его просто не тот ответ, который я хотел: p – Cheetah

2
...is there any way I can avoid this? 

Грубо говоря, нет.

Сериализация - это метод для сохранения данных , а не код. Код для сериализованного класса должен существовать во время десериализации, внутри JVM, в котором вы выполняете десериализацию.

Похоже, вы пытаетесь передать код между двумя JVM.
Существуют методы для этого, но не путем сериализации.

+0

'Есть методы для этого, но не через сериализацию.' ... у вас есть несколько тем, которые я могу использовать для Google (за исключением inbuild RMI)? – Cheetah

+1

Существуют простые механизмы, такие как определение/использование языка выражений, так что вы просто проходите вокруг строк: любой из MVEL, OGNL, Spring EL, JBoss EL может работать на вас. Более сложный метод, фактически проходящий вокруг реального Java-кода, потребует использования пользовательских загрузчиков классов, возможно, в сочетании с библиотекой байтового кода, такой как asm или cglib. – Tim

+0

Проблема в том, что для достижения интерфейса я бы хотел, я не могу преобразовать в EL. Если посмотреть на решение байт-кода, в реальном сценарии это означало бы, что мне пришлось бы загружать 'TestMain' и ** любую из зависимостей TestMain', что может быть довольно много! На самом деле, я просто хочу загрузить lamda, поскольку это все, что меня интересует! – Cheetah

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