Comment puis-je sérialiser élégamment un lambda?
Par exemple, le code ci-dessous lance un NotSerializableException
. Comment puis-je résoudre ce problème sans créer une SerializableRunnable
interface «factice»?
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
assylies
la source
la source
Réponses:
Java 8 introduit la possibilité de convertir un objet en une intersection de types en ajoutant plusieurs limites . Dans le cas de la sérialisation, il est donc possible d'écrire:
Et le lambda devient automatiquement sérialisable.
la source
La même construction peut être utilisée pour les références de méthode. Par exemple ce code:
définit une expression lambda et une référence de méthode avec un type de cible sérialisable.
la source
Très laid casting. Je préfère définir une extension sérialisable à l'interface fonctionnelle que j'utilise
Par exemple:
alors la méthode acceptant le lambda peut être définie comme telle:
et en appelant la fonction, vous pouvez passer votre lambda sans aucun cast laid:
la source
SerializableRunnable
interface" factice ""Au cas où quelqu'un tomberait ici lors de la création du code Beam / Dataflow:
Beam a sa propre interface SerializableFunction, donc pas besoin d'interface factice ou de casts détaillés.
la source
Si vous êtes prêt à passer à un autre cadre de sérialisation comme Kryo , vous pouvez vous débarrasser des multiples limites ou de l'exigence que l'interface implémentée doit implémenter
Serializable
. L'approche consiste àInnerClassLambdaMetafactory
pour toujours générer le code requis pour la sérialisationLambdaMetaFactory
pendant la désérialisationPour plus de détails et le code, consultez cet article de blog
la source