Java 当类被序列化时,为什么SonarQube会给出一个临时/私有错误?

Java 当类被序列化时,为什么SonarQube会给出一个临时/私有错误?,java,serialization,sonarqube,Java,Serialization,Sonarqube,我有一个实现serializable的java类,我假设类中的变量也会被序列化,但SonarQube向我抱怨它不是 我的代码片段如下所示: 如规则文档中所述(您可以单击屏幕截图中的…打开该文档): 此规则对不可序列化的字段和非私有的集合字段(因为可以从外部为它们分配不可序列化的值)提出了问题 无法将此行标记为错误,因为未实现。是可序列化的,但是bondAxeMarkQuoteUpdates受保护,因此有人可以将其他不可序列化列表分配给它(例如在子类中) 要解决此问题,您可以: 将该字段设置为瞬态

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

我的代码片段如下所示:


如规则文档中所述(您可以单击屏幕截图中的…打开该文档):

此规则对不可序列化的字段和非私有的集合字段(因为可以从外部为它们分配不可序列化的值)提出了问题


无法将此行标记为错误,因为未实现。是可序列化的,但是
bondAxeMarkQuoteUpdates
保护
,因此有人可以将其他不可序列化列表分配给它(例如在子类中)

要解决此问题,您可以:

  • 将该字段设置为瞬态,但在序列化期间将忽略它
  • 将该字段设置为私有,以便SonarQube可以验证是否没有人为其分配不可序列化列表
  • 将字段类型更改为可序列化类型(例如)

  • 我收到了相同的错误,解决方案是将变量上使用的类设置为可序列化

    例如,这显示一个错误,因为
    对象
    不可
    序列化

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

    如果您正在使用自己的类(而不是
    对象
    ),您可以将该类设置为
    implements Serializable

    是否
    BondAxeMarkQuoteUpdate
    implement
    Serializable
    ?是的,它也实现了Serializable。我理解这一点,但我不清楚如何获得例如
    private Map=new HashMap()具有
    对象
    Serialized@koala421,请参见此答案:将字段标记为private不起作用。Sonar仍然显示这是一个bug。@Dherik请创建一个新的StackOverflow问题并包含您的代码。您好@agabrys。如果我发现了这个问题,我将为这个问题引入一个新的答案。不幸的是,这对我的情况没有帮助(Serializable是一个标记接口。将第二个参数转换为Serializable的基本原理是什么?Serializable不是对象的替换。这是正确的方法,但需要一些说明。如果所有子类都是可序列化的,则集合被视为可序列化。String是可序列化的,但Object不一定是,由于Java中的所有实例最终都扩展了对象,但并非所有对象实例都实现了可序列化。通过改用可序列化,或通过使自定义元素类实现可序列化,该集合通过类型安全性强制只包含可序列化的子集合,因此可以信任它是可序列化的集合。
    private Map<String, Serializable> map = new HashMap<>();