可外部化的,但没有公共无参数构造函数¶
ID: java/missing-no-arg-constructor-on-externalizable
Kind: problem
Security severity:
Severity: warning
Precision: medium
Tags:
- reliability
- maintainability
- language-features
Query suites:
- java-security-and-quality.qls
实现 java.io.Externalizable
的类必须有一个公共无参数构造函数。在反序列化期间创建对象时,Java 序列化框架会使用该构造函数。如果该类没有定义此类构造函数,则 Java 序列化框架会抛出 InvalidClassException
。
用于 Externalizable
的 Java 开发工具包 API 文档指出
重建
Externalizable
对象时,将使用公共无参数构造函数创建一个实例,然后调用readExternal
方法。
建议¶
确保可外部化的类始终有一个无参数构造函数。
示例¶
在以下示例中,WrongMemo
没有声明公共无参数构造函数。当 Java 序列化框架尝试反序列化对象时,会抛出 InvalidClassException
。但是,Memo
声明了一个公共无参数构造函数,因此对象反序列化成功。
class WrongMemo implements Externalizable {
private String memo;
// BAD: No public no-argument constructor is defined. Deserializing this object
// causes an 'InvalidClassException'.
public WrongMemo(String memo) {
this.memo = memo;
}
public void writeExternal(ObjectOutput arg0) throws IOException {
//...
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
//...
}
}
class Memo implements Externalizable {
private String memo;
// GOOD: Declare a public no-argument constructor, which is used by the
// serialization framework when the object is deserialized.
public Memo() {
}
public Memo(String memo) {
this.memo = memo;
}
public void writeExternal(ObjectOutput out) throws IOException {
//...
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
//...
}
}
参考¶
Java API 规范:Externalizable。