¿Cómo puedo serializar elegantemente una lambda?
Por ejemplo, el siguiente código arroja a NotSerializableException
. ¿Cómo puedo solucionarlo sin crear una SerializableRunnable
interfaz "ficticia"?
public static void main(String[] args) throws Exception {
File file = Files.createTempFile("lambda", "ser").toFile();
try (ObjectOutput oo = new ObjectOutputStream(new FileOutputStream(file))) {
Runnable r = () -> System.out.println("Can I be serialized?");
oo.writeObject(r);
}
try (ObjectInput oi = new ObjectInputStream(new FileInputStream(file))) {
Runnable r = (Runnable) oi.readObject();
r.run();
}
}
java
serialization
lambda
java-8
asilias
fuente
fuente
Respuestas:
Java 8 introduce la posibilidad de convertir un objeto en una intersección de tipos agregando múltiples límites . En el caso de la serialización, por lo tanto, es posible escribir:
Y la lambda se vuelve serializable automáticamente.
fuente
La misma construcción se puede utilizar para referencias de métodos. Por ejemplo este código:
define una expresión lambda y una referencia de método con un tipo de destino serializable.
fuente
Reparto muy feo. Prefiero definir una extensión serializable para la interfaz funcional que estoy usando
Por ejemplo:
entonces el método que acepta el lambda puede definirse como tal:
y llamando a la función puedes pasar tu lambda sin ningún reparto feo:
fuente
SerializableRunnable
interfaz 'ficticia'"En caso de que alguien caiga aquí mientras crea el código Beam / Dataflow:
Beam tiene su propia interfaz de función serializable, por lo que no necesita una interfaz ficticia o modelos detallados.
fuente
Si está dispuesto a cambiar a otro marco de serialización como Kryo , puede deshacerse de los límites múltiples o del requisito que debe implementar la interfaz implementada
Serializable
. El enfoque esInnerClassLambdaMetafactory
para generar siempre el código requerido para la serializaciónLambdaMetaFactory
durante la deserializaciónPara detalles y código, vea esta publicación de blog
fuente