Java:应该是可序列化的内部&;匿名类是否具有SerialVersionId?
虽然我目前不打算序列化任何东西,但我为所有可序列化的外部类以及静态嵌套类提供了一个Java:应该是可序列化的内部&;匿名类是否具有SerialVersionId?,java,serialization,inner-classes,anonymous-class,serialversionuid,Java,Serialization,Inner Classes,Anonymous Class,Serialversionuid,虽然我目前不打算序列化任何东西,但我为所有可序列化的外部类以及静态嵌套类提供了一个SerialVersionUID,因为这是正确的方法 然而,我已经读过了 强烈反对内部类(即非静态成员类的嵌套类)的序列化,包括本地类和匿名类,原因有几个 所以我的问题是: 我应该为内部类和匿名类分别提供一个SerialVersionUID,还是应该为它们添加一个@SuppressWarnings(“serial”) 一种方式比另一种更合适吗 无论如何,我都会暂时引用这些类,因为我不希望它们被序列化。给它们一个se
SerialVersionUID
,因为这是正确的方法
然而,我已经读过了
强烈反对内部类(即非静态成员类的嵌套类)的序列化,包括本地类和匿名类,原因有几个
所以我的问题是:
我应该为内部类和匿名类分别提供一个SerialVersionUID
,还是应该为它们添加一个@SuppressWarnings(“serial”)
一种方式比另一种更合适吗
无论如何,我都会暂时引用这些类,因为我不希望它们被序列化。给它们一个serialVersionUID,因为:
- 这是一个很好的常规做法,明确说明这一点肯定没有坏处
- 警告应该得到解决,而不是压制
- 有时,当内部类变得足够大时,它们会被更改为顶级类
很好(出于您链接到的文档中所述的所有原因),您不会序列化这些内部类的实例。我想,如果你是偏执狂或者担心其他开发者可能不会做出同样的判断,您可以通过在每个内部类中使用
writeObject
方法来强制执行该选择,该方法无条件抛出异常。我认为不应该序列化这些类的建议是不可取的,因为您不知道JVM是什么,反序列化对象的类在类路径上。所以我应该将它们视为其他可序列化类?如果需要版本之间的兼容性,我只会使用serialVersionUID。如果你把对象写在一个文件或类似的文件中。特别是关于匿名类:我注意到opensdk的最新版本已经停止警告这些。(我有opensdk8和opensdk11;前者警告,后者不警告)不确定其他内部类;我发现很难判断编译器是如何决定是否发出警告的。我想我不会在每个内部类中添加writeObject方法。特别是因为一些(主要是匿名类)的目的是尽可能短,以便更整洁。但我至少要添加一个SerialVersionUID。@Lonenebula除非您已经有序列化问题,否则通常不需要添加writeObject()
etc方法。