Mặc dù it is possible to serialize a lambda in Java 8, nó là strongly discouraged; thậm chí serializing inner classes is discouraged. Lý do được đưa ra là lambdas có thể không deserialize đúng trên một JRE. Tuy nhiên, điều này không có nghĩa là có là một cách để tuần tự an toàn một lambda?Làm thế nào để tuần tự an toàn một lambda?
Ví dụ, nói tôi xác định một lớp học để có một cái gì đó như thế này:
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;
}
}
Nếu tôi tuyên bố một thể hiện của lớp như thế này, tôi không nên serialize nó:
MyClass obj = new MyClass("some value", (s) -> !s.isEmpty());
Nhưng nếu tôi tạo một thể hiện của lớp như thế này:
// 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());
Điều này có an toàn để sắp xếp theo thứ tự không? Bản năng của tôi nói rằng có, nó phải được an toàn, vì không có lý do gì mà các giao diện trong java.util.function
nên được xử lý bất kỳ cách nào khác với bất kỳ giao diện ngẫu nhiên nào khác. Nhưng tôi vẫn cảnh giác.
Giao diện hoàn toàn không liên quan đến việc Serialization, do đó, có, triển khai 'Predicate' có tác động tương tự như triển khai bất kỳ giao diện nào khác, * none *. Nhưng giả định của bạn rằng lambdas có thể không deserialize đúng trên một JRE là sai.Có một [đại diện liên tục được xác định rõ] (https://docs.oracle.com/javase/8/docs/api/?java/lang/invoke/SerializedLambda.html). – Holger
@Holger Vậy tại sao [tài liệu oracle] (https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#serialization) dường như gợi ý rằng chúng không? – Justin
Vâng, nó chứa một tham chiếu đến [vấn đề liên quan đến lớp bên trong với serialization] (https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html#serialization). Tóm lại, nó có khả năng tạo ra các phụ thuộc trình biên dịch, chứ không phải các vấn đề cụ thể của JRE. Cấp, văn bản là có một chút gây hiểu lầm. Và quan tâm đến nguy cơ vô tình tuần tự hóa các giá trị được chụp của bối cảnh xung quanh, bao gồm 'this'… – Holger