Wie kann ich ein Lambda elegant serialisieren?
Der folgende Code löst beispielsweise a aus NotSerializableException
. Wie kann ich das Problem beheben, ohne eine SerializableRunnable
"Dummy" -Schnittstelle zu erstellen?
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
Assylien
quelle
quelle
Antworten:
Java 8 bietet die Möglichkeit, ein Objekt durch Hinzufügen mehrerer Grenzen in einen Schnittpunkt von Typen umzuwandeln . Bei der Serialisierung ist es daher möglich zu schreiben:
Und das Lambda wird automatisch serialisierbar.
quelle
Die gleiche Konstruktion kann für Methodenreferenzen verwendet werden. Zum Beispiel dieser Code:
definiert einen Lambda-Ausdruck und eine Methodenreferenz mit einem serialisierbaren Zieltyp.
quelle
Sehr hässliche Besetzung. Ich bevorzuge es, eine serialisierbare Erweiterung für die von mir verwendete Funktionsschnittstelle zu definieren
Beispielsweise:
dann kann die Methode, die das Lambda akzeptiert, als solche definiert werden:
Wenn Sie die Funktion aufrufen, können Sie Ihr Lambda ohne hässliche Besetzung übergeben:
quelle
SerializableRunnable
Falls jemand beim Erstellen des Beam / Dataflow-Codes hierher fällt:
Beam verfügt über eine eigene SerializableFunction- Schnittstelle, sodass keine Dummy-Schnittstelle oder ausführliche Casts erforderlich sind.
quelle
Wenn Sie bereit sind, zu einem anderen Serialisierungsframework wie Kryo zu wechseln , können Sie die Mehrfachgrenzen oder die Anforderung, die die implementierte Schnittstelle implementieren muss, beseitigen
Serializable
. Der Ansatz ist zuInnerClassLambdaMetafactory
um immer den für die Serialisierung erforderlichen Code zu generierenLambdaMetaFactory
während der Deserialisierung direkt anDetails und Code finden Sie in diesem Blogbeitrag
quelle