2011-12-08 54 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