当前位置: 首页 > 知识库问答 >
问题:

枚举的字段是否必须可序列化?

赵星华
2023-03-14

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

然后,我在下面的代码中面对squid:S1948。

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

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

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

我认为在J2SE 5.0(枚举常量的序列化)中不会序列化任何枚举字段

这是假阳性吗?

完整的代码和问题都在这里。

共有3个答案

曾晨
2023-03-14

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

汤飞羽
2023-03-14

如上所述,这是一个误报,因此您可以取消显示警告:

@SuppressWarnings("squid:S1948")
华项明
2023-03-14

它实际上是误报。枚举常量的序列化(您提供了一个链接)说:

枚举常量的序列化方式不同于普通的可序列化或可外部化对象。枚举常量的序列化形式仅由其名称组成;表单中不存在常量的字段值。

在我看来,将枚举字段值标记为瞬态或使其实现可串行化是没有意义的,因为它们永远不会被序列化,无论它们是被标记为瞬态还是实现可串行化。

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

 类似资料:
  • 从ObjectInputStream的Javadoc: 枚举常量的反序列化方式不同于普通的可序列化或可外部化对象。枚举常量的序列化形式仅由其名称组成;常数的字段值不会被传输。要反序列化枚举常量,ObjectInputStream从流中读取常量名称;然后通过调用静态方法Enum获得反序列化常量。valueOf(类,字符串),枚举常量的基类型和接收到的常量名称作为参数。与其他可序列化或可外部化的对象一

  • 问题内容: 我了解是可序列化的。因此,这样做是安全的。(selectedCountry是) 没有客户成员变量的原始枚举 分段 但是,如果我在自定义枚举类中有不可序列化的成员,该怎么办?例如, 原始枚举客户成员变量 我测试了 有用。(我通过在序列化之前和之后打印出所有成员变量的值进行了测试。它们在前后均相同) 但是,我不明白为什么会起作用? 由于我没有提供适当的和,因此需要界面提供。 如有效Java

  • 我试图在Avro模式中创建Union字段,并用它发送相应的JSON消息,但要有一个字段-。 https://avro.apache.org/docs/1.8.2/spec.html#工会 具有相应JSON数据的最简单联合类型(avro模式)的示例是什么?(尝试制作不含NULL/空数据的示例和含NULL/空数据的示例)。

  • 我在使用SpringData/Hibernate按自定义规则对枚举进行排序时遇到了一些小问题。 A有一个名为DeviceState的枚举,它有自己的优先级字段。 枚举由DeviceEntity使用: 有线索吗,救命?点子?请记住,这是生产工作系统,我不能做任何“烟火”。

  • 你好,我在从github到我的项目中实现一些代码源时遇到了问题,所以。。。我正在尝试构建一个管道,然后创建StreamStage来读取源代码,并使用项目中的方法构建一个queuesink,我总是遇到同样的错误“线程中的异常”main“java.lang.IllegalArgumentException:”mapFn“必须可序列化” 我正在阅读关于Hazelcast Jet序列化的文档,一切似乎都很