1

我有一些与 GWT 的 RPC 机制一起使用的可序列化对象。我决定让它们都成为一个包含公共字段(例如“id”、“revision”等)的对象的子类。但是,我注意到 GWT 不会序列化超类的字段,所以我只获取每个超类客户端的类字段为空。

我怎样才能让超类字段也被序列化,而不必为我的每一个 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 不为空。我还尝试让超类实现 Serializable,但没有运气。

欢迎任何建议。

4

2 回答 2

1

要序列化 ​​gwt 中的任何类,您必须在超类中实现 Serializable。

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

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

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

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

问题可能有不同的原因。

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

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

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

4.验证,如果类不在client.*包中,那是在你的GWT xml模块定义中编译的。默认情况下存在。如果您的课程在另一个包中,则必须将其添加到源代码中。例如,如果您的课程在 domain.* 下,您应该将其添加到 xml 作为 . 请注意,该类不能属于服务器包!

5.如果您包含来自另一个 GWT 项目的类,您必须将继承添加到您的 xml 模块定义中。例如,如果你的类 Foo 在包 com.dummy.domain 中,你必须添加到模块定义中。

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

于 2012-05-04T09:47:00.047 回答
0

如果你想让 Super 中的数据被序列化,你必须让它 Serializable。

于 2012-05-04T21:25:43.040 回答