2011-12-08 24 views
1

我有一个类Data,它实现了Serializable接口。本课程具有此类字段Gwt序列号

private boolean q = false; 
    private String a = ""; 
    private List<Someclass> m = Collections.emptyList(); 
    private List<Object[]> d = Collections.emptyList(); 

分配给这些成员的值是默认值。 Someclass类还实现Serializable并且它具有这样的列

private Types sqlType; 
    private int columnWidth; 
    private String columnName; 

Types是这也实现了串行化的一个枚举。

Data I类具有List<Object[]> d中,我将节省通过JDBC从数据库fethced数据(迭代ResultSet当我使用getObject()方法)。我使用这样的构造,因为它可以运行任何查询(查询的结构未知)。在List<Someclass> 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 

它为什么发生?我所有的传输对象都是可序列化的。

编辑 好吧,Object无法序列化,因此它不能被传递到并从服务器返回。但是我应该在这种情况下使用。泛型不会帮助我,因为我不知道在编译时的类型

+0

无论“Object”不可串行化,最好在RPC调用中使用ArrayList而不是List。参见[http://stackoverflow.com/a/3060233/595072](http://stackoverflow。com/a/3060233/595072) – dimchez

+0

我们使用ArrayList 而不是'ArrayList '。你会得到GWT编译警告,但没关系。 – Strelok

回答

2

为了使类可序列化,基本上所有可以从中获得的东西都必须是可序列化的。在这种情况下,Object不是可序列化的,这使得Object []不可序列化,这使得List不可序列化,这使得数据不可序列化。

想想这样:如果你不能序列化Object []中给定的对象,你将如何序列化Object []?如果你不能序列化,你将如何序列化一个列表?如果你不能序列化这个列表,你将如何序列化包含该列表的东西?

现在,可能是因为Object []中的所有内容都是可序列化的 - 但是您键入它的方式,编译器无法保证。

编辑:关于你应该用什么来代替,我会创建一些包装类,将保存SQL查询的结果,并使该序列化。

+0

但我试图序列化数据对象到文件,并且序列化良好。 gwt是否使用另一种序列化? – maks

+2

@maks是的,GWT RPC不会执行正常的Java序列化。请参阅http://code.google.com/webtoolkit/doc/latest/FAQ_Server.html#Does_the_GWT_RPC_system_support_the_use_of_java.io.Serializable和http://code.google.com/webtoolkit/doc/latest/DevGuideServerCommunication.html#DevGuideSerializableTypes –

0

您不能在此使用List,因为Object []不可序列化。

您需要创建一个不同的Serializable类,它可以保存从查询中获得的任何列值。

也许是这样的:

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 []的数组中,根据查询中的元数据为每个值选择正确的子类型。

+0

In你的例子你声明一个成员变量_intValue整数,但正如我所说的用户可以输入任何SQL查询,所以我现在不会什么类型它将在运行前保存 – maks

+0

我已更新--- – antlersoft