【问题标题】:SonarLint V3: Fields in a "Serializable" class should either be transient or serializable for List interfaceSonarLint V3:“Serializable”类中的字段对于 List 接口应该是瞬态的或可序列化的
【发布时间】:2017-12-29 23:13:20
【问题描述】:

我的问题与this 非常相似,只是我在 SonarLint V3 (squid:S1948) 中遇到了这个问题。

我的代码是:

public class Page<T> implements Serializable {

    Summary summary;
    List<T> elements;

    public Page() {
        summary = new Summary();
    }

    public List<T> getItemsReceived() {
        return elements;
    }

    public void setItemsReceived(List<T> list) {
        this.elements = list;
    }

    public Summary getSummary() {
        return summary;
    }

    public void setSummary(Summary summary) {
        this.summary = summary;
    }

}

摘要对象实现可序列化。

public class Summary implements Serializable {

    int offset;
    int limit;
    long totalElements;

    public int getOffset() {
        return offset;
    }

    public void setOffset(int offset) {
        this.offset = offset;
    }

    public int getLimit() {
        return limit;
    }

    public void setLimit(int limit) {
        this.limit = limit;
    }

    public long getTotalNumberOfElements() {
        return totalElements;
    }

    public void setTotalNumberOfElements(long totalNumberOfElements) {
        this.totalElements = totalNumberOfElements;

    }

}

现在,如果我将 List 替换为 ArrayList ,那么 SonarLint 中会出现另一个警告,即我们应该使用接口而不是实现类。

我认为这可能会在 SonarQube 中解决,但对于 SonarLint 我不知道。 这是一个错误还是我做错了什么?

【问题讨论】:

  • SonarQube 和 SonarLint 共享负责检测 Java 代码 redirect.sonarsource.com/plugins/java.html 中问题的分析器,因此如果您在两个工具中使用相同版本的 SonarJava,您应该会看到相同的问题。现在关于您的代码,在哪个文件和哪一行出现问题?
  • Page 类。 SonarLint 报告 List 是不可序列化的,因此应该是。如果我用 ArrayList 替换它,那么它报告我应该使用接口。在这两种方式中,我都得到了这个。我的问题:这是几年前SonarQube 中的一个错误,由于我使用的是最新版本的SonarLint,为什么这仍然出现在 intellij 中?
  • 这与您链接的问题不同。看我的回答。
  • 严格回答问题:添加// NOSONAR 隐藏警告。 (但是Page&lt;T extends Serializable&gt; 也是必要的,正如@TiborBlenessy 提到的那样。)

标签: java intellij-idea sonarqube sonarlint


【解决方案1】:

SonarLint 是对的。问题是不能保证elements 字段是可序列化的。您需要像这样在T 类型上添加类型绑定

public class Page<T extends Serializable> implements Serializable {}

这样,如果为列表选择的实现是可序列化的(Java 中的标准集合类型也是如此),则列表将是可序列化的。

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 2016-12-12
    • 2020-02-02
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2012-07-05
    • 2016-07-01
    相关资源
    最近更新 更多