【发布时间】:2016-06-24 16:47:19
【问题描述】:
虽然it is possible to serialize a lambda in Java 8,却是strongly discouraged;甚至serializing inner classes is discouraged。给出的原因是 lambda 可能无法在另一个 JRE 上正确反序列化。但是,这是否意味着有一种安全序列化 lambda 的方法?
例如,假设我定义一个类是这样的:
public class MyClass {
private String value;
private Predicate<String> validateValue;
public MyClass(String value, Predicate<String> validate) {
this.value = value;
this.validateValue = validate;
}
public void setValue(String value) {
if (!validateValue(value)) throw new IllegalArgumentException();
this.value = value;
}
public void setValidation(Predicate<String> validate) {
this.validateValue = validate;
}
}
如果我这样声明一个类的实例,我就不应该序列化它:
MyClass obj = new MyClass("some value", (s) -> !s.isEmpty());
但是如果我像这样创建一个类的实例呢:
// Could even be a static nested class
public class IsNonEmpty implements Predicate<String>, Serializable {
@Override
public boolean test(String s) {
return !s.isEmpty();
}
}
MyClass isThisSafeToSerialize = new MyClass("some string", new IsNonEmpty());
现在可以安全地序列化吗?我的直觉说是的,它应该是安全的,因为没有理由将java.util.function 中的接口与任何其他随机接口区别对待。但我还是很警惕。
【问题讨论】:
-
接口与序列化完全无关,所以是的,实现
Predicate与实现任何其他接口具有相同的影响,none。但是您认为 lambda 可能无法在另一个 JRE 上正确反序列化的假设是错误的。有一个well defined persistent representation。 -
@Holger 那为什么oracle docs 似乎暗示他们没有?
-
嗯,它包含对inner class related problems with serialization 的引用。简而言之,它可能会创建编译器依赖项,而不是 JRE 特定的问题。当然,文本有点误导。请注意意外序列化捕获的周围上下文值的危险,包括
this...
标签: java serialization lambda java-8