// ChildObjectValue.java
public class ChildObjectValue extends GenericObjectValue {
private static final long serialVersionUID = xxxx;
private BigDecimal bigDecimal;
public BigDecimal getBigDecimal()
{
return bigDecimal;
}
public void setBigDecimal(BigDecimal bigDecimal)
{
this.bigDecimal = bigDecimal;
}
}
// ChildObjectServiceASync.java
void loadChildObject(AsyncCallback<List<ChildObjectValue>> callback);
// ChildObjectServiceImpl.java
// (...)
List<ChildObjectValue> childrenObjects = new ArrayList<ChildObjectValue>();
ChildObjectValue childObjectValue = new ChildObjectValue();
childObjectValue.setBigDecimal(new BigDecimalChildClass("1.04"));
// BigDecimalChildClass extends BigDecimal but has many dependencies tocomponents not compilable by GWT
// (...)
return childrenObjects; // ASyncCallBack return value
执行结果: com.google.gwt.user.client.rpc.SerializationException:类型'... BigDecimalChildClass'未包含在可由此SerializationPolicy序列化的类型集中,或者无法加载其Class对象。出于安全考虑,此类型不会被序列化:instance = 1.04
实际上,如果我更改ChildObjectValue.java,并将ChildObjectValue.bigDecimal声明从BigDecimal更改为BigDecimalChildClass,GWT将拒绝编译。
我猜这个问题来自方法setBigDecimal(BigDecimal bigDecimal),它允许BigDecimal的子类作为参数。 GWT的DevGuideServerCommunication确实说GWT RPC支持多态参数和返回类型,但是,我很困惑。必须有一些我还不太了解的限制。
我想我可以更改setBigDecimal方法,从可能的子类化参数创建一个新的BigDecimal对象,但这个问题的正确解决方案是什么? 我是否必须确保对于我的每个AsyncCallback类型参数,它们的非瞬态字段和set / get参数是最终类的实例?
最后但并非最不重要的是,似乎使用BigDecimal不会请GWT。保存/加载值确实有效,但我最终在Eclipse控制台中使用它: java.lang.InstantiationException:java.math.BigDecimal 继续...... java.lang.RuntimeException:无法评估:= Class.new(); 继续...... 我想这是由于BigDecimal没有无参数构造函数......我该怎么办?