Serialization of a lambda after its creation
java, java-8, lambda, serialization
Solution
This is correct, and by design. Just as you cannot take a non-serializable object and make it serializable after instantiation, once a lambda is created, its serializability is set.
A lambda is serializable if its target type is serializable (and its captured arguments are serializable.) Your first example is serializable because the target type is the intersection (Runnable & Serializable). Your two attempts to convert `r` fail because in both cases, `r` is a captured variable that is not serializable, and so the resulting lambda expression / method reference is not serializable. (The receiver for a bound method reference acts as a captured variable.)
Problem
I can serialize a lambda with the following syntax: ``` Runnable r = (Runnable & Serializable) () -> System.out.println(""); try (ObjectOutput oo = new ObjectOutputStream(new ByteArrayOutputStream())) { oo.writeObject(r); } ``` However if I receive the lambda from a client code and it has not been cast appropriately, I can't serialize it. How can I serialize `r` below without changing its definition: ``` Runnable r = () -> System.out.println(""); ``` I have tried to serialize a "derived" object: ``` Runnable r1 = (Runnable & Serializable) r::run; Runnable r2 = (Runnable & Serializable) () -> r.run(); ``` but in each case, `oo.writeObject(rxxx);` fails with a `NotSerializableException`.