【发布时间】:2011-11-17 11:30:51
【问题描述】:
我正在尝试使用 JavaBeans 进行一些简单的 XML 序列化,对象具有五个 getter/setter 属性和两个 getter。这两个来自 List<...> 类型:
public List<MasterDataQueryMDType> getType() {
if (type == null) {
type = new ArrayList<MasterDataQueryMDType>();
}
return this.type;
}
和
public List<MasterDataQueryKey> getKey() {
if (key == null) {
key = new ArrayList<MasterDataQueryKey>();
}
return this.key;
}
然后我使用 XMLEncoder 类(虽然这里 JAXB 可能更合适,但我现在保持简单)。生成的 XML 只有五个 getter/setter 属性,两个 List 类型的属性没有被编码。是因为它们是只读的,还是我必须为这些通用列表编写 PersistenceDelegate ?
好的,我已经研究了更多,而解决这个问题的最简单的方法就是创建一个包装类:
public class MasterDataQueryWrapper {
private MasterDataQuery query;
public MasterDataQuery getQuery(){
return this.query;
}
public void setQuery(MasterDataQuery value){
this.query = value;
}
public List<MasterDataQueryMDType> getType(){
return query.getType();
}
public void setType(List<MasterDataQueryMDType> value){
for (MasterDataQueryMDType t:value){
this.query.getType().add(t);
}
}
public List<MasterDataQueryKey> getKey(){
return query.getKey();
}
public void setKey(List<MasterDataQueryKey> value){
for (MasterDataQueryKey k:value){
this.query.getKey().add(k);
}
}
}
这样,java Beans 获取和设置只读属性没有问题。但是,如果您有更优雅的解决方案,请随时加入...
【问题讨论】:
-
但是编码器抛出了一些小错误:java.lang.NullPointerException Continuing ... java.lang.InstantiationException: java.math.BigDecimal Continuing ... java.lang.RuntimeException: failed评估:
=Class.new();继续... java.lang.InstantiationException: java.math.BigDecimal 继续... java.lang.RuntimeException: 评估失败: =Class.new();继续... -
您知道接口 List 本身不扩展可序列化吗?你的问题可能来自那里吗?另外:
MasterDataQueryMDType是否可序列化? -
是的,'MasterDataQueryMDType' 是可序列化的,但这里的问题似乎是原始类中的属性 'getKey' 和 'getText' 是只读的,这不是 javaBeans-conform。在这种情况下,XMLEncoder 会简单地忽略这些属性。在我的解决方案中,我提供了一个包装类,它只是为这两个属性添加了一个 setter,然后一切都被序列化了。