Java:可序列化的内部和匿名类是否应该有SerialVersionUID?

4

虽然我目前没有计划对任何内容进行序列化,但我会为所有可序列化的外部类以及静态嵌套类分配一个SerialVersionUID,因为这是正确的做法。

然而,我在这里读到:

强烈不建议序列化内部类(即非静态成员类的嵌套类,包括本地和匿名类)等,有几个原因...

所以我的问题是:

我应该给内部和匿名类分别分配一个SerialVersionUID,还是应该在这些类中添加@SuppressWarnings("serial")

哪种方式更恰当?

无论如何,我都会将这些类的引用设置为瞬态,因为我不想它们被序列化。


我认为不建议序列化这些类的建议是因为您不知道反序列化对象的JVM是否在类路径上具有这些类。 - keuleJ
那么我应该像对待其他可序列化的类一样对待它们吗? - Lone nebula
只有在需要版本兼容性的情况下,我才会使用 serialVersionUID,例如,如果您将对象写入文件或类似位置。 - keuleJ
关于匿名类:我注意到最近版本的OpenSDK已经停止对其发出警告。(我有OpenSDK8和OpenSDK11;前者会发出警告,后者则不会。)其他内部类我不确定;我很难判断编译器如何决定是否发出警告。 - Don Hatch
1个回答

4
给它们一个serialVersionUID,因为:
  • 这是良好的一般实践,指定它肯定不会有害。
  • 警告应该被解决,而不是被抑制。
  • 有时候,内部类在变得足够大时会更改为顶级类。
对于所有在文档中链接的原因,指定serialVersionUID是很好的(做法)。我想,如果您非常谨慎或担心其他开发人员可能没有采取同样的明智选择,您可以通过在每个内部类中编写一个writeObject方法来强制执行该选择,该方法无条件地抛出异常。

我想我不会去为每个内部类添加writeObject方法,特别是一些(主要是匿名类)旨在尽可能简短,以获得更整洁的代码。但至少我会添加一个SerialVersionUID。 - Lone nebula
@Lonenebula 通常情况下,除非您已经遇到了序列化问题,否则不需要添加 writeObject() 等方法。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接