【问题标题】:Including outside variables when serializing an object序列化对象时包含外部变量
【发布时间】: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


【解决方案1】:

无论变量范围如何,只要这些变量的类型为Serializable,序列化的 lambda 将包含外部变量。确保情况确实如此,您一切顺利。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-01
    • 2014-07-10
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2015-10-02
    相关资源
    最近更新 更多