我有一些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,没有运气。
欢迎任何建议。
答案 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中的数据,则必须使其可序列化。