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

时间:2014-12-01 02:54:47

标签: java scala serialization deserialization serializable

我尝试使用Java 8 lambdas并且有关于对象序列化的一般问题。 例如,如果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做这样的事情,还是有任何语言有这样的功能?

1 个答案:

答案 0 :(得分:0)

无论变量范围如何,只要这些变量的类型为Serializable,序列化的lambdas将包含外部变量。确保是这样的,你很高兴。