如何序列化超类的字段以及可序列化的类

时间:2012-05-04 09:34:25

标签: java gwt serialization gwt-rpc

我有一些Serializable对象,我使用GWT的RPC机制。 我决定让它们全部成为一个包含公共字段的对象,例如“id”,“revision”等。 但是,我注意到GWT没有序列化超类的字段,所以我只是在客户端将每个超类字段都设为null。

如何在不必为每个Serializable类编写CustomFieldSerializer的情况下将超类字段序列化?有可能吗?

示例:

public class Super {
    private String id;

    public String getId() {
        return id;
    }

}

public class Sub extends Super implements Serializable {
    private String name;

    // more stuff here
}


// on the client side, inside an AsyncCallback
onSuccess(Sub sub) {
    assert(sub.getId() != null);
}

因此,当我通过GWT的RPC机制将其发送到客户端时,我在任何Sub实例的'id'字段中得到一个空值。我确保在服务器中,id不为null。我也试图使超类实现Serializable,没有运气。

欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

为了序列化gwt中的任何类,你必须在超类中实现Serializable。

要传递bean,您必须满足以下要求(来自GWT站点):

1.它直接实现Java Serializable或GWT IsSerializable接口,或者因为它派生自超类。

2.非最终的非瞬态实例字段本身是可序列化的

3.它有一个带有任何访问修饰符的默认(零参数)构造函数(例如私有Foo(){}将起作用)

问题可能有不同的原因。

1.验证该类具有默认构造函数(不带参数)

2.验证该类实现Serializable或IsSerializable或实现扩展Serializable的接口或扩展实现Serializable的类

3.验证该类是否在客户端。*包或...

4.如果类不在客户端。*包中,则验证在GWT xml模块定义中编译。默认情况下存在。如果您的班级在另一个包中,则必须将其添加到源。例如,如果您的类在域。*下,则应将其添加到xml中。请注意,该类不能属于服务器包!

5.如果您要从另一个GWT项目中包含该类,则必须将继承添加到xml模块定义中。例如,如果您的类Foo位于包com.dummy.domain中,则必须添加到模块定义中。

6.如果您将另一个作为jar发布的GWT项目中的类包含在内,则验证jar还包含源代码,因为GWT还重新编译传递给客户端的类的Java源代码。

答案 1 :(得分:0)

如果您希望序列化Super中的数据,则必须使其可序列化。