尽管Java 8中可以序列化lambda表达式,但这是强烈不建议的,甚至序列化内部类也不鼓励。给出的原因是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
中的接口没有理由被视为与其他随机接口不同。但我仍然有所顾虑。