有一个实现Serializable
的类,并具有一个类型为Object
的属性。由SonarQube
扫描时出现错误。它说可序列化类的属性必须为serializable
或transient
。因此,我认为也许默认属性的序列化由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。
答案 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。