GWT 2.5.1序列化和子类化问题

时间:2015-06-24 09:15:20

标签: java gwt serialization

// 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没有无参数构造函数......我该怎么办?

0 个答案:

没有答案