当前位置: 首页 > 面试题库 >

为什么没有自动生成serialVersionUID?

狄高畅
2023-03-14
问题内容

为什么不serialVersionUID自动生成?我在应用程序服务器上遇到了一个问题,该服务器显然正在缓存一个旧类。


问题答案:

不会自动生成serialversionuid,因为它很危险。设置serialversionuid时,表示类的两个版本在序列化方面兼容。

假设您有一个名为Foo的类,并且它 没有serialversionuid
(默认值),并且将Foo的实例序列化为文件。稍后,您将一些新成员添加到Foo类。如果尝试从文件中反序列化Foo对象,则会出现序列化失败,指出对象不兼容。他们
不兼容的,这是 你想要的东西 ,这是默认。它们不兼容,因为无法从旧的序列化Foo实例初始化Foo类中的新成员。

现在,您可能会说:“我不在乎,在我的应用程序中,可以将那些字段初始化为可接受的”。如果 确实 如此,则可以将
Foo类的serialversionuid设置为与
Foo类相同。这将告诉Java这些对象在可序列化方面是兼容的,并且当您将旧的Foo实例反序列化为新的Foo类时,Java将不会抱怨(但是新字段仍将未初始化)。

如果您是第一次创建新类,并且设置了serialversionuid,则 您正在输入合同 。该合同是,
“对于具有相同serialversionuid的此类的所有将来版本,我将保证它们在状态和序列化方面都是兼容的”

如果更改了一个类,并且 明确禁止
对旧版本进行反序列化,则可以将serialversionuid更改为新值。如果尝试将旧对象反序列化为新的类实例,则将引发异常。



 类似资料:
  • 默认添加的栏目为静态浏览,是不生成静态的需要在栏目中配置是否生成静态

  • 问题内容: 当Java编译器将原语自动包装到包装类时,它在幕后生成什么代码?我想象它调用: 包装器上的valueOf()方法 包装器的构造函数 还有其他魔术吗? 问题答案: 您可以使用该工具亲自查看。编译以下代码: 编译和反汇编: 输出为: 因此,如您所见,自动装箱将调用static方法,而自动拆箱将在给定对象上调用。没什么,真的- 只是语法糖。

  • 问题内容: 我正在尝试在32位Linux上使用LiteIDE(Go IDE)。除自动完成功能外,其他所有功能均可用。构建,运行,一切正常。该二进制文件似乎正在运行: 我可能做错了什么? 问题答案: 您可能需要设置GOROOT =。要在LiteIDE中进行设置,请寻找环境工具栏;它应该是一个下拉列表,可能已预先选择了“系统”和一个按钮。单击按钮以显示“编辑环境”窗格,然后双击“ system.env

  • 我有一个接口,有两个实现。使用哪个实现取决于环境(生产、开发、测试……)。因此,我使用Spring配置文件。我正在使用一个配置文件来实例化正确的实现。 当Spring容器启动时(使用特定的概要文件),正确的bean就会被带入类中,所有的工作都很好。 我还有一个测试类,我想在其中autowire这个bean。我正在使用@mock进行自动化。在测试类中,配置文件被设置为“test-unit”。因此,我

  • 问题内容: 我正在尝试做这样的事情: 不幸的是,即使在Java 9中也不存在。 为什么它被遗漏了? 建议的解决方法是什么? 问题答案: 为什么它被遗漏了? 该API提供了可重用的构建块。这里的相关积木是,,。通过这些,您可以实现所需的功能:将流内映射到对象,然后获得平面图。提供构建基块的排列是不切实际的,并且很难扩展。 建议的解决方法是什么? 如前所述,使用可用的构建基块(+ ):

  • 许多编译器都提供128位整数类型,但我使用过的编译器都没有提供typedefs。为什么? 据我回忆,标准 用于此目的的储量 鼓励提供此类类型的实现提供typedef 要求此类实现提供至少128位的intmax_t (而且,我不相信我使用了实际上符合最后一点的实现)