我有一些可序列化对象,我将它们与 GWT 的 RPC 机制一起使用。 我决定让它们都成为包含公共(public)字段(例如“id”、“revision”等)的对象的子类。 但是,我注意到 GWT 不会序列化父类(super class)的字段,因此我只是在客户端将每个父类(super class)字段设置为 null。
如何才能序列化父类(super class)字段,而无需为每个可序列化类编写 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不为空。我还尝试使父类(super class)实现可序列化,但没有运气。
欢迎任何建议。
最佳答案
要序列化 gwt 中的任何类,您必须在父类(super class)中实现 Serialized。
要传递 Bean,您必须满足以下要求(来自 GWT 站点):
1.它直接实现 Java Serialized 或 GWT IsSerialized 接口(interface),或者因为它派生自具有该接口(interface)的父类(super class)。
2.它的非最终、非 transient 实例字段本身是可序列化的
3.它有一个带有任何访问修饰符的默认(零参数)构造函数(例如 private Foo(){} 将起作用)
该问题可能有不同的原因。
1.验证类是否有默认构造函数(不带参数)
2.验证该类是否实现了 Serializable 或 IsSerializable,或者实现了扩展 Serialized 的接口(interface),或者扩展了实现 Serialized 的类
3.验证该类是否在 client.* 包中或...
4.验证该类是否不在 client.* 包中,该包是在 GWT xml 模块定义中编译的。默认情况下存在。如果您的类位于另一个包中,则必须将其添加到源中。例如,如果您的类位于domain.* 下,您应该将其添加到 xml 作为 .请注意,该类不能属于服务器包!
5.如果您要包含来自另一个 GWT 项目的类,则必须将继承添加到您的 xml 模块定义中。例如,如果您的类 Foo 位于包 com.dummy.domain 中,您必须添加到模块定义中。
6.如果您要包含以 jar 形式发布的另一个 GWT 项目中的类,请验证该 jar 是否也包含源代码,因为 GWT 还会重新编译传递给客户端的类的 Java 源代码。
关于java - 如何序列化父类(super class)以及可序列化类的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10446296/