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

为什么SonarQube认为int[][][][]不可序列化

柳飞鸾
2023-03-14

在我的代码中,我有以下行:

private int[][][] shapes;

在野外,它生活在一个枚举中:

public enum TetrisGamePiece {
    private int id;
    private int pieceColour;
    private int[][][] shapes; // <-- This line is not accepted

    private TetrisGamePiece(int id, int colour, int[][] shape1, int[][] shape2, int[][] shape3, int[][] shape4) {
        this.id = id;
        this.pieceColour = colour;
        this.shapes = new int[][][]{shape1, shape2, shape3, shape4};
    }
    // ... the rest of the enum ... 
    // i've left out instantiation of objects to save space. 

我从sonarqube那里得到以下提及:

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

据我所知,int[](和int[][]等)是可序列化的。这是sonarqube中的一个bug还是我误解了基本类型数组的可序列化性?

编辑:添加了它所在的枚举,以防枚举类型相关

共有1个答案

左丘昊天
2023-03-14

正如@Simon Brandhof的评论中提到的,这确实是所选规则中的一个错误。

该问题是由于原语不被检查视为可序列化。票https://jira.codehaus.org/browse/SONARJAVA-918将修复此问题。感谢您的报道。

 类似资料:
  • 问题内容: 如下代码: 引发以下异常: 我猜内部类具有一个允许对其私有访问的字段和方法的字段。声明内部类static 可以解决它,但是如果需要此访问权限怎么办?有没有一种方法可以在不包含封闭类的情况下序列化非静态内部类,例如通过引用外部类? 编辑:例如,仅在序列化之前才需要访问外部类。好的,编译器不知道这一点,但是我认为这就是关键字存在的原因。 问题答案: 如果InnerClass需要此访问权限怎

  • 我在一个项目中工作,然后创建了一个新项目,在打开旧项目后,它不被识别为java项目。没有在包中创建类的选项(如您在pic上所见),空的中间包不会隐藏,但该选项被设置为on。 为什么intelij-idea不认可java项目?

  • 问题内容: 根据Java文档中的Serializability: 通过实现java.io.Serializable接口的类,可以启用类的可序列化性。未实现此接口的类将不会对其状态进行序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义 为什么对象尚未实现?我们不希望可序列化的成员可以设为。为什么要阻止默认的Serializability?

  • 我试图在Java中序列化,但在运行我的程序时,我收到一个。 查看类,我注意到它没有实现。 为什么不实现?

  • 问题内容: 为什么认为超出范围,而低于int ? 问题答案: 在Java和其他几种语言中,以开头的整数文字0被解释为八进制(基数8)的数量。 对于单位数(比其他和,这是不允许的),结果是一样的,所以你可能没有意识到他们被解释为八进制。但是,如果你写的数字的有效位数不止一个,那么结果可能会让你感到困惑。 例如: 由于八进制文字通常不是你想要的,因此请务必小心,切勿以开头的整数文字0,除非你当然实际上

  • 如果接口只是一个标记接口,用于在 java 中传递有关类的某种元数据 - 我有点困惑: 在阅读了java的序列化算法(元数据从下到上,然后从上到下的实际实例数据)的过程之后,我无法真正理解哪些数据不能通过该算法进行处理。 简而言之: 哪些数据可能导致? 我怎么知道我不应该为我的类添加子句?