【问题标题】:Why is SonarQube giving a transient/private error when class is Serialized?为什么当类被序列化时 SonarQube 会给出瞬态/私有错误?
【发布时间】:2017-05-11 14:12:13
【问题描述】:

我有一个实现可序列化的 java 类,我假设类中的变量也会被序列化,但 SonarQube 向我抱怨它不是。

我的sn-p代码如下:

【问题讨论】:

  • BondAxeMarkQuoteUpdate 是否实现了Serializable
  • 是的,它也实现了可序列化

标签: java serialization sonarqube


【解决方案1】:

SonarQube 将此行标记为错误,因为 java.util.List 没有实现 java.io.Serializablejava.util.ArrayList 是可序列化的,但 bondAxeMarkQuoteUpdatesprotected,因此有人可以为其分配其他不可序列化的列表(例如在子类中)。

要解决问题,您可以:

  1. 将该字段设为transient,但在序列化过程中会被忽略
  2. 将该字段设为private,以便SonarQube 可以验证没有人为其分配了不可序列化的列表
  3. 将字段类型更改为可序列化类型(例如java.util.ArrayList

【讨论】:

  • 将该字段标记为私有没有帮助。 Sonar 仍然将此显示为一个错误。
  • @Dherik 请创建一个新的 StackOverflow 问题并包含您的代码。
  • 嗨@agabrys。我发现问题,我会为这个问题引入一个新的答案
【解决方案2】:

我收到同样的错误,解决方案是将变量上使用的类设置为Serializable

例如,这显示一个错误,因为Object 不是Serializable

private Map<String, Object> map = new HashMap<>();

案例中最简单的解决方案是转第二个参数Serializable。所以,你可以使用:

private Map<String, Serializable> map = new HashMap<>();

如果你使用自己的类(而不是Object),你可以把类放到implements Serializable

【讨论】:

  • 不幸的是,这对我没有帮助(
  • Serializable 是一个标记接口。将第二个参数设为 Serializable 的基本原理是什么?
  • Serializable 不是 Object 的替代品。
  • 这是正确的方法,但需要进行一些说明。如果所有子类都是可序列化的,则认为集合是可序列化的。 String 是可序列化的,但 Object 不一定是可序列化的,因为 Java 中的所有实例最终都扩展了 Object,但并非所有对象实例都实现了 Serializable。通过使用 Serializable 代替,或者通过使自定义元素类实现 Serializable,该集合通过类型安全强制执行,以仅包含可序列化的子项,因此可以信任为可序列化的集合。
【解决方案3】:

如规则文档中所述(您可以单击屏幕截图中的 ... 打开):https://sonarqube.com/coding_rules#rule_key=squid%3AS1948

此规则在非可序列化字段和非私有的集合字段上引发问题(因为它们可以在外部分配非可序列化值)

【讨论】:

  • 我明白这一点,但我对如何让private Map&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;(); 获得Object 序列化感到困惑
  • @koala421,看到这个答案:stackoverflow.com/a/48141335/2387977
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 2019-02-08
  • 2016-07-01
  • 2015-12-24
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
相关资源
最近更新 更多