Java 如何序列化超类和可序列化类的字段

Java 如何序列化超类和可序列化类的字段,java,gwt,serialization,gwt-rpc,Java,Gwt,Serialization,Gwt Rpc,我有一些可序列化的对象,我使用GWT的RPC机制。 我决定将它们都作为一个包含公共字段(如“id”、“revision”等)的对象的子类。 然而,我注意到GWT并没有序列化超类的字段,所以我只是在客户端将每个超类字段都设置为null 如何在不必为每一个可序列化类编写CustomFieldSerializer的情况下也序列化超级类字段?可能吗 示例: public class Super { private String id; public String getId() {

我有一些可序列化的对象,我使用GWT的RPC机制。 我决定将它们都作为一个包含公共字段(如“id”、“revision”等)的对象的子类。 然而,我注意到GWT并没有序列化超类的字段,所以我只是在客户端将每个超类字段都设置为null

如何在不必为每一个可序列化类编写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”字段中得到一个null值。我确保在服务器中,id不为null。我还试图让超级类实现可序列化,但运气不好


欢迎任何建议。

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

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

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

2.其非最终、非临时实例字段本身是可序列化的

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

这个问题可能有不同的原因

1.验证该类是否具有默认构造函数(无参数)

2.验证类是否实现了Serializable或IsSerializable,或者是否实现了扩展Serializable的接口,或者是否扩展了实现Serializable的类

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

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

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


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

要序列化GWT中的任何类,您必须在super class中实现Serializable

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

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

2.其非最终、非临时实例字段本身是可序列化的

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

这个问题可能有不同的原因

1.验证该类是否具有默认构造函数(无参数)

2.验证类是否实现了Serializable或IsSerializable,或者是否实现了扩展Serializable的接口,或者是否扩展了实现Serializable的类

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

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

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


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

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

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

请向我们展示一个最小的代码片段,它可以可靠地演示问题。这非常简单,我认为不需要它。。。但我还是要添加它。请给我们看一个最小的代码片段,它可以可靠地演示这个问题。这太简单了,我认为不需要它。。。但我还是要添加它。Super中的一个字段存在另一个问题,阻止我将其序列化。。。在解决了这个问题并使其可序列化之后,它实际上起了作用…超级中的一个字段出现了另一个问题,阻止了我使其可序列化。。。在解决了这个问题并使超级序列化后,它实际上起了作用。。。