java - 如何序列化父类(super class)以及可序列化类的字段

标签 java gwt serialization gwt-rpc

我有一些可序列化对象,我将它们与 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/

相关文章:

java - 我无法在tomcat中使用JNDI连接MySQL

java - Spring MVC Hibernate MySQL - 少1天进入数据库

java - 速记变量赋值

java - gwt 2.7 maven 项目是否必须是多模块的?

gwt - 取消 GWT RequestFactory 请求

java - 使用输出流序列化对象

java - Java 的前缀匹配/trie?

c# - 将包含非英文字符的C# POCO序列化为JSON

Django REST框架: create JSON fragments from string

java - Vaadin、Gwt、gwt + 服务器端的东西,还有其他东西吗?