Java 是否枚举';s字段必须是可序列化的吗?

Java 是否枚举';s字段必须是可序列化的吗?,java,sonarqube,Java,Sonarqube,我正在分析SonarQube 5.1版的JavaSE7项目 然后,我在下面的代码中遇到了squid:S1948 一个“可序列化”类中的字段应该是暂时的或可序列化的 可序列化类中的字段本身必须是可序列化的或瞬态的,即使该类从未显式序列化或反序列化。这是因为在负载下,大多数J2EE应用程序框架都会将对象刷新到磁盘,而一个据称具有非瞬态、非序列化数据成员的可序列化对象可能会导致程序崩溃,并为攻击者打开大门 我认为在J2SE5.0()中不会序列化任何枚举字段 这是假阳性吗 整个代码和问题都是。我只需将该

我正在分析SonarQube 5.1版的JavaSE7项目

然后,我在下面的代码中遇到了
squid:S1948

一个“可序列化”类中的字段应该是暂时的或可序列化的

可序列化类中的字段本身必须是可序列化的或瞬态的,即使该类从未显式序列化或反序列化。这是因为在负载下,大多数J2EE应用程序框架都会将对象刷新到磁盘,而一个据称具有非瞬态、非序列化数据成员的可序列化对象可能会导致程序崩溃,并为攻击者打开大门

我认为在J2SE5.0()中不会序列化任何枚举字段

这是假阳性吗


整个代码和问题都是。

我只需将该字段标记为瞬态。

它实际上是一个假阳性。(您提供了一个链接)说明:

枚举常量的序列化方式与普通可序列化的不同 或可外化对象。枚举常量的序列化形式 仅由其名称组成;常量的字段值不正确 以形式呈现

在我看来,将
Enum
的字段值标记为
transient
或使它们实现
Serializable
,是没有意义的,因为它们永远不会被序列化,不管它们是被标记为
transient
还是实现
Serializable


如果这个分析工具强迫你做这两件事中的一件,那么你将编写无用的代码。如果我是你,我会尝试禁用
enum
s的警告。

如前所述,这是一个假阳性,因此你可以抑制警告:

@SuppressWarnings(“squid:S1948”)
enum ShutterSpeed {
   private final Rational value; // Make "value" transient or serializable.
   ...
}