序列化对象时包括外部变量

Boy*_*ame 6 java serialization scala serializable deserialization

我正在尝试使用Java 8 lambdas并且有关于对象序列化的一般问题.例如,如果executor.execute只有一个方法并且在没有序列化的情况下运行代码块,则以下输入将打印5.但是,如果我通过SerializedLambda序列化lambda表达式并将其反序列化,则它会打印null,因为它在此新的反序列化对象中没有前一个上下文.此外,它编译没有任何投诉,因为第一个上下文解决了外部变量.(本例中为finalVar):

final int finalVar = 5;
executor.execute(() -> {
    System.out.println(finalVar);
});
Run Code Online (Sandbox Code Playgroud)

我想知道是否有可能告诉SerializedLambda将finalVar包含到序列化输出中,而不实现具有finalVar变量字段的接口,并在构造时将其值设置为字段.AFAIK,这是用Java做这种事情最干净的方法:

final int finalVar = 5;
executor.execute(new Runnable() {
    int myVar = finalVar;

    public void run() { 
         System.out.println(myVar);
    }
);
Run Code Online (Sandbox Code Playgroud)

我甚至不确定这一点,但我认为编译器可以找出外部变量,并在我尝试序列化该lambda时序列化并包含它们.有没有什么技巧可以让Java做这样的事情,还是有任何语言有这样的功能?

gkn*_*ker 0

无论变量作用域如何,序列化 lambda 都将包含外部变量,只要这些变量的类型为Serializable. 确保情况确实如此,然后就可以开始了。