我将尝试使用java.beans.XMLEncoder将POJO(普通旧Java对象)转换为XML。我的代码可以正常工作,但是当我省略POJO中的默认构造函数时,会出现一个有趣的问题。以下为类示例:
控制台输出与默认构造函数省略
我在谷歌上搜索了一下,但找不到关于这个问题的解释。为什么隐式默认构造函数对于XMLEncoder来说不够?
没有默认构造函数的POJO
public class NFLTeam implements Serializable {
private String name;
private String description;
// public NFLTeam() {
//
// }
public NFLTeam(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
XMLEncoder的调用
public static void main(String args[]) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
XMLEncoder xmlEncoder = new XMLEncoder(byteArrayOutputStream);
NFLTeam team = new NFLTeam("Bears", "Play for Chicago");
xmlEncoder.writeObject(team);
xmlEncoder.close();
System.out.println(byteArrayOutputStream);
}
控制台输出与默认构造函数省略
java.lang.InstantiationException: oce.wsd.pojos.NFLTeam
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject(NFLTeam);
Continuing ...
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_45" class="java.beans.XMLDecoder">
</java>
使用默认构造函数的控制台输出
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_45" class="java.beans.XMLDecoder">
<object class="oce.wsd.pojos.NFLTeam">
<void property="description">
<string>Play for Chicago</string>
</void>
<void property="name">
<string>Bears</string>
</void>
</object>
</java>
我在谷歌上搜索了一下,但找不到关于这个问题的解释。为什么隐式默认构造函数对于XMLEncoder来说不够?