Java Gwt序列化

Java Gwt序列化,java,gwt,jdbc,Java,Gwt,Jdbc,我有一个类Data,它实现了Serializable接口。这个类有这样的字段 private boolean q = false; private String a = ""; private List<Someclass> m = Collections.emptyList(); private List<Object[]> d = Collections.emptyList(); Types是一个枚举,它还实现了可序列化 在Data类

我有一个类
Data
,它实现了
Serializable
接口。这个类有这样的字段

    private boolean q = false;
    private String a = "";
    private List<Someclass> m = Collections.emptyList();
    private List<Object[]> d = Collections.emptyList();
Types
是一个枚举,它还实现了可序列化

Data
类中,我有
列表d
,在其中我将通过jdbc保存数据库中的数据(在迭代
ResultSet
时,我使用
getObject()
方法)。我使用这种构造,因为它可以运行任何查询(查询的结构未知)。在
列表m
中,我持有查询的metada。因此,当我尝试使用简单查询获取行时,我得到

com.google.gwt.user.client.rpc.SerializationException: Type '[Ljava.lang.Object;' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = [Ljava.lang.Object;@127053a9
为什么会这样?我的所有传输对象都是可序列化的

编辑
好的,
对象
不可序列化,因此无法将其传递到服务器或从服务器返回。但在这种情况下我应该使用什么。泛型对我没有帮助,因为我不知道编译时的类型。为了使类可序列化,从它可以得到的所有东西基本上都必须是可序列化的。在这种情况下,对象不可序列化,这使对象[]不可序列化,使列表不可序列化,使数据不可序列化

这样考虑:如果无法序列化对象[]中的给定对象,如何序列化对象[]?如果你不能序列化它,你将如何序列化它的列表?如果无法序列化该列表,那么如何序列化包含该列表的内容

现在,可能是对象[]中的所有内容最终都是可序列化的——但按照您键入它的方式,编译器无法保证这一点


编辑:关于您应该使用什么,我将创建某种包装类来保存SQL查询的结果,并使其可序列化。

您不能在此处使用列表,因为对象[]不可序列化

您需要创建一个不同的、可序列化的类,该类可以保存从查询中获得的任何列值

也许是这样的:

public abstract class ColumnValue implements Serializable
{
    public abstract Object getValue();
}

public class IntColumnValue extends ColumnValue
{
    private Integer _intValue;
    public Object getValue()
    {
         return _intValue;
    }
}

.
.
.

为可能返回的每个列类型创建ColumnValue的子类。当您有一个Object[]数组时,您可以将其移动到ColumnValue[]数组中,根据查询中的元数据为每个值选择正确的子类型。

但是我尝试将数据对象序列化到文件,它序列化得很好。gwt是否使用另一种序列化?@maks是的,gwt RPC不执行正常的Java序列化。请参阅,在您的示例中,您将一个成员变量_intValue声明为整数,但正如我所说的,用户可以输入任何sql查询,因此我现在不知道它在运行时之前将保持什么类型,不管
对象
不可序列化,最好在RPC调用中使用
ArrayList
,而不是
列表
。请参见我们使用
ArrayList
而不是
ArrayList
。您将收到GWT编译警告,但这没关系。
public abstract class ColumnValue implements Serializable
{
    public abstract Object getValue();
}

public class IntColumnValue extends ColumnValue
{
    private Integer _intValue;
    public Object getValue()
    {
         return _intValue;
    }
}

.
.
.