lambda创建后的序列化

时间:2014-08-19 19:37:38

标签: java serialization lambda java-8

我可以使用以下语法serialize a lambda

Runnable r = (Runnable & Serializable) () -> System.out.println("");
try (ObjectOutput oo = new ObjectOutputStream(new ByteArrayOutputStream())) {
  oo.writeObject(r);
}

但是,如果我从客户端代码收到lambda并且没有正确转换,我就无法对其进行序列化。

如何在不更改其定义的情况下序列化r以下内容:

Runnable r = () -> System.out.println("");

我试图序列化"派生"对象:

Runnable r1 = (Runnable & Serializable) r::run;
Runnable r2 = (Runnable & Serializable) () -> r.run();

但在每种情况下,oo.writeObject(rxxx);都失败并显示NotSerializableException

1 个答案:

答案 0 :(得分:15)

这是正确的,并且是设计的。正如您无法在实例化后获取非可序列化对象并使其可序列化一样,一旦创建了lambda,就会设置其可序列化。

如果lambda的目标类型是可序列化的(并且其捕获的参数是可序列化的),则lambda是可序列化的。您的第一个示例是可序列化的,因为目标类型是交集(Runnable& Serializable)。您转换r的两次尝试都失败了,因为在这两种情况下,r都是一个不可序列化的捕获变量,因此生成的lambda表达式/方法引用不可序列化。 (绑定方法引用的接收器充当捕获变量。)