【发布时间】:2015-01-29 00:34:46
【问题描述】:
我正在尝试使用 Java 8 lambda,并且有一个关于对象序列化的一般性问题。 例如,如果 executor.execute 只有一种方法并且运行代码块而不对其进行序列化,则以下输入将打印 5。 但是,如果我通过 SerializedLambda 序列化 lambda 表达式并将其反序列化,它会打印 null,因为它在这个新的反序列化对象中没有先前的上下文。此外,由于第一个上下文解析了外部变量,因此它编译时没有任何抱怨。 (本例中为 finalVar):
final int finalVar = 5;
executor.execute(() -> {
System.out.println(finalVar);
});
我想知道是否可以告诉 SerializedLambda 将 finalVar 包含到序列化输出中,而无需实现具有 finalVar 变量字段并在构造时将其值设置为字段的接口。 AFAIK,这是在 Java 中做这种事情的最干净的方法:
final int finalVar = 5;
executor.execute(new Runnable() {
int myVar = finalVar;
public void run() {
System.out.println(myVar);
}
);
我什至不确定,但我认为编译器可以找出外部变量,并在我尝试序列化该 lambda 时序列化和包含它们。 Java 有什么技巧可以做这样的事情,或者有没有任何语言具有这样的功能?
【问题讨论】:
-
是的,序列化的 lambdas 应该自动包含捕获的变量,而不需要任何特殊的魔法。
-
可能与此处描述的 Eclipse 错误有关:stackoverflow.com/questions/23837215/…
-
您的操作系统/IDE/Java 版本是什么?我无法重现这个。
-
它确实有效,原因是外部变量之一不可序列化,因此无法序列化 lambda。
标签: java scala serialization deserialization serializable