我想学习Java及其最新版本中的序列化工作原理。我试图像这样序列化一个lambda表达式:
Runnable r = (Runnable & Serializable)() -> {System.out.println("This is a test");};
但是我注意到关于serialVersionUID
变量的缺失,我没有任何警告。这正常吗?
我知道它将在运行时生成,但强烈建议定义它:https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html
如果一个可序列化的类没有明确声明一个 serialVersionUID,则序列化运行时将根据类的各个方面计算出一个默认的 serialVersionUID 值,如Java(TM)对象序列化规范中所述。然而,强烈建议所有可序列化的类都明确声明 serialVersionUID 值,因为默认的 serialVersionUID 计算对类细节高度敏感,这些细节可能因编译器实现而异,因此可能导致意外的 InvalidClassExceptions 在反序列化期间。因此,为了保证在不同的java编译器实现之间具有一致的 serialVersionUID 值,可序列化的类必须声明一个显式的 serialVersionUID 值。同时,强烈建议使用 private 修饰符来声明显式的 serialVersionUID,因为这样的声明仅适用于立即声明的类—— serialVersionUID 字段作为继承成员是没有用处的。数组类不能声明显式的 serialVersionUID,因此它们始终具有默认计算值,但是对于数组类,匹配 serialVersionUID 值的要求被豁免了。
我该怎么做?如何在我的 Lambda 中定义它?
谢谢
serialVersionUID
字段,因为缺少定义类。这直接导致了下一个问题:为什么应该将 lambda 序列化?它没有字段,因此也没有数据! - Seelenvirtuose