【问题标题】:Does enum's field have to be Serializable?枚举的字段是否必须是可序列化的?
【发布时间】:2015-10-04 14:51:41
【问题描述】:

我正在通过 SonarQube 5.1 版分析 Java SE 7 项目。

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

“可序列化”类中的字段应该是瞬态的或可序列化的

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

enum ShutterSpeed {
   private final Rational value; // Make "value" transient or serializable.
   ...
}

我认为任何枚举字段都不会在 J2SE 5.0 中序列化 (Serialization of Enum Constants)

这是误报吗?

整个代码和问题是here

【问题讨论】:

    标签: java sonarqube


    【解决方案1】:

    实际上是误报。 Serialization of Enum Constants(你提供了一个链接)说:

    枚举常量的序列化方式与普通可序列化不同 或可外化的对象。枚举常量的序列化形式 仅由其名称组成;常量的字段值不是 出现在表格中。

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

    如果该分析工具迫使您执行这两件事中的一件,那么您将编写无用的代码。如果我是你,我会尝试禁用 enums 的警告。

    【讨论】:

      【解决方案2】:

      如前所述,这是误报,因此您可以取消警告:

      @SuppressWarnings("squid:S1948")
      

      【讨论】:

        【解决方案3】:

        我会简单地将字段标记为瞬态。

        【讨论】:

          猜你喜欢
          • 2015-01-03
          • 2013-08-24
          • 2014-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-09
          相关资源
          最近更新 更多