如果没有类定义对象,则无法反序列化对象。lambda表达式没有改变。
Lambda表达式要复杂一些,因为它们生成的运行时类不是定义它的类,但是它们的定义类是保存Lambda主体代码的类,如果是可序列化的Lambda,则使用反序列化支持方法,该方法用于验证并重新实例化lambda实例。
见
SerializedLambda:
可序列化lambda的实现者(例如编译器或语言运行时库)应确保实例正确反序列化。这样做的
writeReplace一种方法是确保该方法返回的实例SerializedLambda,而不是允许进行默认序列化。SerializedLambda有一个readResolve方法寻找$deserializeLambda$(SerializedLambda)在捕获类中调用的(可能是私有的)静态方法,以其本身作为第一个参数调用该方法,并返回结果。实现的Lambda类$deserializeLambda$负责验证的属性SerializedLambda是否与该类实际捕获的Lambda一致。
因此,即使您的实例未引用定义类内部的综合方法(例如,在方法引用此类之外的方法的情况下),反序列化仍然需要
$deserializeLambda$有意地验证实例的正确性。
关于序列化lambda的“最佳实践”,请记住,lambda表达式封装 行为
而不是状态。存储行为始终意味着仅存储某种参考,并且需要用于恢复它的代码来实现相关的行为。如果您只是通过符号名称或存储(例如关联的
enum值)来引用预期的行为,那也将起作用。



