JVM如何处理Serializable中的默认属性?

时间:2019-03-19 09:25:38

标签: java

有一个实现Serializable的类,并具有一个类型为Object的属性。由SonarQube扫描时出现错误。它说可序列化类的属性必须为serializabletransient。因此,我认为也许默认属性的序列化由jvm或容器控制。在哪里可以找到描述这种机制的文章?

public class AHttpResponse implements Serializable {
    private String responseCode;
    private Object data; // SonarQube detect this line has `Major` problem
    .....
}

此类是保存请求的结果代码和结果数据的基类。响应将类似于前端中的以下json字符串:

{
    "responseCode": "0",
    "data": {
        "userName":"xxx"
    }
}

{
    "responseCode": "0",
    "data": [
        { "userName": "xxx" },
        { "userName": "yyy" }
    ]
}

因此,AHttpResponse的{​​{1}}可以是data或JavaBean。

3 个答案:

答案 0 :(得分:2)

我认为您的AHttpResponse在这种情况下不会被序列化,因此最简单的方法是使您的类不实现Serializable

public class AHttpResponse {
    private String responseCode;
    private Object data;
    .....
}

答案 1 :(得分:1)

在上面的类中,data的类型为Object,这意味着它可以或不能序列化(取决于其子类型,例如String是可序列化的,而List不是)。让我们看看javadoc对可序列化类的不可序列化属性的看法:

  

反序列化期间,不可序列化类的字段将为   使用的公共或受保护的无参数构造函数初始化   类。无参数构造函数必须可访问以下子类:   可序列化。可序列化子类的字段将被还原   从流中。

由于从声明中看不出该字段的行为(即它可能可序列化或可能无法序列化),因此Sonarqube会显示警告。

答案 2 :(得分:0)

正如@Keijack指出的,Serializable与序列化为JSON无关。

Serializable标记接口使JVM知道使用Java对象序列化机制可以将该类序列化为字节流/从字节流反序列化。

当执行这样的操作时(使用Jave Object Serialization规范中的示例),将使用Java序列化进行序列化:

    // Serialize today's date to a file.
    FileOutputStream f = new FileOutputStream("tmp");
    ObjectOutput s = new ObjectOutputStream(f);
    s.writeObject("Today");
    s.writeObject(new Date());
    s.flush();

如果您不想使用Java序列化,只需删除Serializable接口。

有关Java对象序列化的更多详细信息,请参见Java Object Serialization Specification