序列化的 lambda 且没有serialVersionUID?

2024-05-01

我正在尝试了解 Java 及其最新版本的序列化如何工作。我正在尝试像这样序列化 lambda:

Runnable r = (Runnable & Serializable)() -> {System.out.println("This is a test");};

但我注意到我没有收到关于缺少serialVersionUID多变的。正常吗?

我知道它将在运行时生成,但强烈建议定义它:https://docs.oracle.com/javase/8/docs/api/java/io/Serializing.html https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html

如果一个可序列化类没有显式声明一个serialVersionUID,那么序列化运行时将计算一个 基于各个方面的该类的默认serialVersionUID值 类的属性,如 Java(TM) 对象序列化中所述 规格。不过,强烈建议所有 可序列化类显式声明serialVersionUID值,因为 默认的serialVersionUID计算对类高度敏感 细节可能会因编译器实现而异,并且可以 因此会导致意外的 InvalidClassExceptions 反序列化。因此,要保证serialVersionUID一致 跨不同java编译器实现的值,可序列化 类必须声明显式的serialVersionUID 值。也是 强烈建议显式的serialVersionUID声明使用 尽可能使用 private 修饰符,因为此类声明仅适用于 立即声明类 --serialVersionUID 字段不是 作为继承成员有用。数组类不能显式声明 SerialVersionUID,因此它们始终具有默认的计算值,但是 免除匹配serialVersionUID值的要求 数组类。

我应该怎么办 ?如何在 Lambda 中定义它?

Thanks


The serialVersionUID仅与生成的类相关流标识符 http://docs.oracle.com/javase/8/docs/api/java/io/ObjectStreamClass.html。如果可序列化类有一个,则情况并非如此writeReplace()方法(也描述于Serializable文档 http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html)返回不同类的替代对象,因为这样的表示与原始类完全解耦。这就是可序列化 lambda 实例发生的情况,请参阅SerializedLambda http://docs.oracle.com/javase/8/docs/api/java/lang/invoke/SerializedLambda.html:

可序列化 lambda 的实现者(例如编译器或语言运行时库)应确保实例正确反序列化。这样做的一种方法是确保writeReplace方法返回一个实例SerializedLambda,而不是允许默认序列化继续进行。

所以这是一个实例SerializedLambda最终出现在流上,因此该类有责任拥有稳定的序列化表示。不幸的是,这并不能保护您免受可能的不兼容性的影响。

反序列化时,定义 lambda 表达式的类的合成方法将被调用(与this https://stackoverflow.com/a/28960234/2711488 and 这个答案 https://stackoverflow.com/a/28084460/2711488),这将拒绝与该类中 lambda 表达式的现有定义不匹配的反序列化尝试,而匹配可能取决于 lambda 定义的微妙方面。请注意,甚至使用 Eclipse 重新编译定义类而不是javac可能会破坏序列化兼容性。

也不是的安全影响Serializable lambdas https://stackoverflow.com/q/25443655/2711488。一般来说,我建议避免使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

序列化的 lambda 且没有serialVersionUID? 的相关文章

  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • java.lang.Class: 在 java 程序中初始化 log4j 属性文件时出错

    我正在尝试使用 log4j 运行独立的 java 程序 但在调试时收到以下消息 控制台上没有 log4j 相关日志 log Logger 1343 java lang Class ERROR in 18b4aac2 有人可以建议这里出了什么
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • Java替换特定字符

    这是我在这个网站上的第一个问题 所以我会尽量不要成为一个十足的菜鸟 我目前正在用java 创建刽子手游戏 所以我问你的问题是我们是否被赋予了 幽灵 这个词 并将 Ghost 替换为 hiddenWord ghost length for i
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • Java:VM 如何在 32 位处理器上处理 64 位“long”

    JVM 如何在 32 位处理器上处理 64 位的原始 long 在多核 32 位机器上可以并行利用多个核心吗 64 位操作在 32 位机器上慢了多少 它可能使用多个核心来运行不同的线程 但不会并行使用它们进行 64 位计算 64 位长基本上
  • 具有多种值类型的 Java 枚举

    基本上我所做的是为国家编写一个枚举 我希望不仅能够像国家一样访问它们 而且还能够访问它们的缩写以及它们是否是原始殖民地 public enum States MASSACHUSETTS Massachusetts MA true MICHI
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • 如何为 Jackson 编写一个包罗万象的(反)序列化器

    当您提前知道类型时 编写自定义序列化器非常容易 例如 MyType一个人可以写一个MyTypeSerializer extends StdSerializer
  • Spock模拟inputStream导致无限循环

    我有一个代码 gridFSFile inputStream bytes 当我尝试这样测试时 given def inputStream Mock InputStream def gridFSDBFile Mock GridFSDBFile
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐