Java 制造;“类”;暂时的或可序列化的,但该类是可序列化的

Java 制造;“类”;暂时的或可序列化的,但该类是可序列化的,java,serialization,sonarqube,Java,Serialization,Sonarqube,SonarQube 5.1在审查了我的代码后标记了许多关键问题。但是,类本身和字段中引用的类也是可序列化的。被引用的类通过类继承可序列化接口 这是我的例子 public class A implements Serializable { private B b; // -> Sonarcube markes this field as not serialzable } B类的定义如下 public class B extends C { .... } public ab

SonarQube 5.1在审查了我的代码后标记了许多关键问题。但是,类本身和字段中引用的类也是可序列化的。被引用的类通过类继承可序列化接口

这是我的例子

public class A implements Serializable {
     private B b;  // -> Sonarcube markes this field as not serialzable
}
B类的定义如下

public class B extends C {
 ....
}
public abstract class C extends D {
 ....
}
C类的定义如下

public class B extends C {
 ....
}
public abstract class C extends D {
 ....
}
定义了D类

public abstract class D implements Serializable {
  ....
}
在同一项目上运行FindBugs不会发现这些问题。 我不确定这是sonarcube中的错误还是我的代码有其他问题(C、D类中的其他字段或其他内容)


有人有线索吗?

可能是因为没有正确提供二进制文件。我的SonarQube配置也有类似的问题,然后我发现实现
Serializable
的类位于不同的模块和/或外部库中


sonar.java.binaries
sonar.java.libraries
设置正确的值,允许SonarQube定位二进制文件并正确确定类是否可序列化。

仅仅因为某个基类实现了
可序列化
,并不意味着所有派生类都可以自动序列化可正确序列化。派生类应该定义自己的
serialVersionUid
。派生类还可以引入其值可能不可序列化的新字段

因此,除非SonarQube暗示作者实际上想让类可序列化(可能通过重新启动
实现可序列化
或声明
serialVersionUid
),否则SonarQube根据Liskov替换原则怀疑它是正确的


然而,关键的分类可能需要讨论。但这在这里太有观点依据了。

您是否正确地提供了字节码?(带Q)你所说的“你是否正确地向SonarQube提供字节码?”是什么意思?C类和D类打包在一个单独的JAR文件中,该文件位于用于编译、打包……的pom文件中。SonarQube分析是如何运行的?使用maven还是sonar runner?您正在使用哪个版本的sonar java插件?它是通过maven运行的。不是sonar RunnerSonar.java.binaries在SonarCubes设置中的位置?