3

尽管目前我没有计划序列化任何东西,但我给所有可序列化的外部类以及静态嵌套类SerialVersionUID,因为这是正确的方法。Java:应该可序列化的内部匿名类具有Seri​​alVersionUID吗?

不过,我读过here

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

所以我的问题是:

我应该给内部和匿名类每一个SerialVersionUID,或者我应该添加一个@SuppressWarnings("serial")那些?

比其他方式更合适吗?

我会在任何情况下引用这样的类为transient,因为我不希望它们被序列化。

+0

我认为你不应该序列化这些类的建议是不鼓励的,因为你不知道JVM是什么,反序列化对象的类有类路径上的类。 – keuleJ 2013-03-18 12:47:19

+0

所以我应该把它们当作其他可序列化类来对待? – 2013-03-18 13:00:39

+0

如果您需要版本之间的兼容性,我只会使用serialVersionUID。例如。如果您将对象写入文件或类似文件中。 – keuleJ 2013-03-18 13:27:23

回答

3

给他们的serialVersionUID,这是因为:

  • 这是很好的一般做法,它肯定不会伤害到指定。
  • 警告应该解决,而不是压制。
  • 有时候,当内部类变得足够大时,内部类会变成顶级类。

这很好(因为您链接到的文档中所述的所有原因),您将不会序列化这些内部类的实例。我想,如果你是偏执狂或担心其他开发者可能不会行使相同的判断力,那么可以通过在每个无条件抛出异常的内部类中使用writeObject方法来强制执行该选择。

+0

我想我不会为每个内部类添加writeObject方法。尤其是因为一些(主要是匿名类)的目的是尽可能短,以获得更多的整洁。但我至少要添加一个SerialVersionUID。 – 2013-03-18 13:27:51

+0

@Lonenebula除非已经有序列化问题,否则通常不需要添加'writeObject()'等方法。 – EJP 2013-03-19 04:33:44