Serialisieren eines lambda?
Wie kann ich aus serialisieren eines lambda?
Beispielsweise der folgende code wirft eine NotSerializableException
. Wie kann ich es beheben ohne eine SerializableRunnable
"dummy" - Schnittstelle?
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();
}
}
Dies ist zwar möglich (siehe die ausgewählte Antwort) sollte jeder wohl zweimal überlegen, tatsächlich, dies zu tun. Es ist offiziell "dringend abgeraten" und kann serious Sicherheit Auswirkungen.
InformationsquelleAutor assylias | 2014-04-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java 8 stellt die Möglichkeit zur cast ein Objekt, um eine Kreuzung der Arten durch hinzufügen von mehreren Grenzen. Im Fall der Serialisierung, es ist also möglich zu schreiben:
Und der lambda-Ausdruck wird automatisch serialisierbar.
Die Anlage zu werfen, um eine Kreuzung-Typ wurde Hinzugefügt, um ein Ziel geben für die Typ-Inferenz von lambdas. Da AICs haben einen MANIFESTEN Typ (d.h., sein Typ ist nicht abgeleitet) Gießen einer AIC zu einer Kreuzung Typ ist das nicht sinnvoll. (Es ist möglich, nur nicht nützlich.) Ein AIC mehrere interfaces implementieren, müssen Sie erstellen eine neue subschnittstelle, dass sich alle von Ihnen, und dann instanziieren.
Dies wird produzieren eine compiler-Warnung, Nein zu sagen serialVersionUID definiert ist?
Hinweis: dies funktioniert nur, wenn Sie die Darsteller während der Bauphase. Das folgende wirft eine classcastexception-Fehler: Runnable r = () -> System.aus.println("Serializable!"); Runnable serializableR = (Runnable & Serializable)r;
Ja, siehe auch: stackoverflow.com/questions/25391656/...
InformationsquelleAutor assylias
Gleichen Aufbaus verwendet werden kann für die Methoden-Referenzen. Zum Beispiel dieser code:
definiert einen lambda-Ausdruck und eine Methode Referenz mit einer serialisierbaren target.
InformationsquelleAutor Vicente Romero
Sehr hässliche Stimmen. Ich bevorzuge es, zu definieren, eine Serialisierbare Erweiterung der funktionalen Schnittstelle, die ich verwende
Beispiel:
dann ist die Methode der Annahme der lambda-Ausdruck kann wie folgt definiert werden :
und die Funktion aufrufen, können Sie übergeben Sie Ihre lambda-ohne hässliche Darsteller:
SerializableRunnable
'dummy' - Schnittstelle"InformationsquelleAutor Pascal
Wenn Sie bereit sind, zu wechseln Serialisierungs-framework wie Kryo, können Sie loszuwerden, die mehrere Grenzen oder die Anforderung, dass die implementierte Schnittstelle implementieren muss
Serializable
. Der Ansatz istInnerClassLambdaMetafactory
immer generieren Sie den erforderlichen code für die SerialisierungLambdaMetaFactory
bei der DeserialisierungDetails und code finden Sie unter diesem blog-post
InformationsquelleAutor ruediste