Bagaimana saya bisa membuat serial lambda secara elegan?
Misalnya, kode di bawah ini melempar a NotSerializableException
. Bagaimana saya bisa memperbaikinya tanpa membuat SerializableRunnable
antarmuka "dummy"?
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
assylias
sumber
sumber
Jawaban:
Java 8 memperkenalkan kemungkinan untuk melemparkan objek ke persimpangan jenis dengan menambahkan beberapa batas . Dalam hal serialisasi, karena itu dimungkinkan untuk menulis:
Dan lambda secara otomatis menjadi serial.
sumber
Konstruksi yang sama dapat digunakan untuk referensi metode. Misalnya kode ini:
mendefinisikan ekspresi lambda dan referensi metode dengan tipe target serial.
sumber
Pemain yang sangat jelek. Saya lebih suka mendefinisikan ekstensi Serializable ke antarmuka fungsional yang saya gunakan
Sebagai contoh:
maka metode menerima lambda dapat didefinisikan sebagai berikut:
dan memanggil fungsi Anda dapat melewati lambda Anda tanpa pemain jelek:
sumber
SerializableRunnable
antarmuka 'dummy'"Jika seseorang jatuh di sini saat membuat kode Beam / Dataflow:
Beam memiliki SerializableFunction Interface sendiri sehingga tidak perlu antarmuka dummy atau gips verbose.
sumber
Jika Anda ingin beralih ke kerangka kerja serialisasi lain seperti Kryo , Anda dapat menyingkirkan beberapa batasan atau persyaratan yang harus diterapkan oleh antarmuka yang diimplementasikan
Serializable
. Pendekatannya adalah untukInnerClassLambdaMetafactory
untuk selalu menghasilkan kode yang diperlukan untuk serialisasiLambdaMetaFactory
selama deserializationUntuk detail dan kode, lihat posting blog ini
sumber