BAEL-5283: Serialize a lambda in Java
This commit is contained in:
parent
49b6155952
commit
0947c71710
|
@ -0,0 +1,8 @@
|
||||||
|
package com.baeldung.java8.lambda.serialization;
|
||||||
|
|
||||||
|
public class NotSerializableLambdaExpression {
|
||||||
|
public static Object getLambdaExpressionObject() {
|
||||||
|
Runnable r = () -> System.out.println("please serialize this message");
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package com.baeldung.java8.lambda.serialization;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class SerializableLambdaExpression {
|
||||||
|
public static Object getLambdaExpressionObject() {
|
||||||
|
Runnable r = (Runnable & Serializable) () -> System.out.println("please serialize this message");
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
package com.baeldung.java8.lambda.serialization;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
public class LambdaSerializationUnitTest {
|
||||||
|
@Test(expected = NotSerializableException.class)
|
||||||
|
public void givenRunnable_whenNoCapturing_thenSerializationFailed() throws IOException, ClassNotFoundException {
|
||||||
|
Object obj = NotSerializableLambdaExpression.getLambdaExpressionObject();
|
||||||
|
writeAndReadObject(obj, Runnable.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenIntersectionType_whenNoCapturing_thenSerializationSuccess() throws IOException, ClassNotFoundException {
|
||||||
|
Object obj = SerializableLambdaExpression.getLambdaExpressionObject();
|
||||||
|
writeAndReadObject(obj, Runnable.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSerializableRunnable_whenNoCapturing_thenSerializationSuccess() throws IOException, ClassNotFoundException {
|
||||||
|
SerializableRunnable obj = () -> System.out.println("please serialize this message");
|
||||||
|
writeAndReadObject(obj, SerializableRunnable.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSerializableFunction_whenNoCapturing_thenSerializationSuccess() throws IOException, ClassNotFoundException {
|
||||||
|
SerializableFunction<String, String> obj = message -> String.format("Hello %s", message);
|
||||||
|
writeAndReadObject(obj, SerializableFunction.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSerializableConsumer_whenNoCapturing_thenSerializationSuccess() throws IOException, ClassNotFoundException {
|
||||||
|
SerializableConsumer<String> obj = System.out::println;
|
||||||
|
writeAndReadObject(obj, SerializableConsumer.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = NotSerializableException.class)
|
||||||
|
public void givenSerializableConsumer_whenCapturingNotSerializable_thenSerializationFailed() throws IOException, ClassNotFoundException {
|
||||||
|
SerializableConsumer<String> obj = System.out::println;
|
||||||
|
writeAndReadObject(obj, SerializableConsumer.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T> void writeAndReadObject(Object obj, Class<T> clazz) throws IOException, ClassNotFoundException {
|
||||||
|
File file = Files.createTempFile("lambda", "ser").toFile();
|
||||||
|
try (
|
||||||
|
FileOutputStream fos = new FileOutputStream(file);
|
||||||
|
ObjectOutputStream oos = new ObjectOutputStream(fos)
|
||||||
|
) {
|
||||||
|
oos.writeObject(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
try (
|
||||||
|
FileInputStream fis = new FileInputStream(file);
|
||||||
|
ObjectInputStream ois = new ObjectInputStream(fis)
|
||||||
|
) {
|
||||||
|
Object newObj = ois.readObject();
|
||||||
|
boolean isInstance = clazz.isInstance(newObj);
|
||||||
|
|
||||||
|
assertTrue(isInstance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SerializableRunnable extends Runnable, Serializable {
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SerializableFunction<T, R> extends Function<T, R>, Serializable {
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SerializableConsumer<T> extends Consumer<T>, Serializable {
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue