2010-05-19 107 views
7

我有一段時間返回通過RPC實現IsSerializable對象的ArrayList。 IsSerializable pojo包含一個變量,一個String,並且有一個0參數構造函數。我從戰爭刪除.gwt.rpc文件,我仍然可以得到:GWT序列化問題

com.google.gwt.user.client.rpc.SerializationException: Type 'com.test.myApp.client.model.Test' 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 = [email protected] 
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:610) 

我使用GWT 2.0.2使用JDK 1.6.0_18。

關於可能發生什麼或我做錯什麼的想法?

這裏是Test類的代碼,遠程方法返回ArrayList。我甚至修改了它的代碼,只是返回一個具有相同結果的Test實例:上面的異常。

package com.test.myApp.client.model; 

import com.google.gwt.user.client.rpc.IsSerializable; 

public class Test implements IsSerializable{ 
    private String s; 

    public Test() {} 

    public Test(String s) { 
     this.s = s; 
    } 

    public String getS() { 
     return s; 
    } 

    public void setS(String s) { 
     this.s = s; 
    } 
} 

非常感謝幫助! Eddy

+0

你可以發佈client.model.Test的代碼嗎? – Stevko 2010-05-19 02:21:21

+0

也許在Test類中的一個實例字段是不可序列化的。發佈代碼以獲取更多幫助。 – Carnell 2010-05-19 03:51:46

+0

你是否聲明你的遠程服務方法返回ArrayList ?如果你只是聲明ArrayList,那麼GWT不會知道你將需要序列化測試。 正如上述評論者所建議的,張貼代碼。 – tgdavies 2010-05-19 06:21:20

回答

1

遠程方法需要返回ArrayList<Test>,而不僅僅是ArrayList,以便GWT知道需要序列化Test的實例。

+0

遠程方法返回ArrayList 。就像我所說的,我甚至試圖用相同的結果返回一個Test實例。 – Eddy 2010-05-20 13:41:36

1

我習慣使用Serializable接口聲明,所以這個答案可能不適用。

Eclipse總是提示我爲任何Serializable類創建一個serialVersionUID成員。

private static final long serialVersionUID = 2388319784164372900L; 

一想到剛剛打我,在你的構建中有些東西不同步。我建議你做兩件事:a)Project |清理,然後b)GWT編譯項目。

+0

我試着用一個生成的serialVersionUID使用Serializable,但那也沒有工作。雖然謝謝!任何其他想法? – Eddy 2010-05-21 00:10:14

+0

我已經嘗試了a和b ..實際上無數次。 – Eddy 2010-05-21 12:44:37

+0

昨晚我剛碰到這個錯誤信息。我部署了(幾次)稍微修改過的大型項目,但沒有增加版本號,並且不斷收到舊類的序列化異常。最後增加版本號並重新部署 - 清理完畢。 你的Test類甚至被翻譯成JavaScript嗎? 檢查包含在myApp.gwt.xml 標記中的路徑。評論陳述了「可以譯出可譯代碼的路徑」。 – Stevko 2010-05-21 21:38:04

0

or its Class object could not be loaded

com/test/myApp/client/model/Test.class包含在你的戰爭中嗎?

5

這可能聽起來很愚蠢,但是您在代碼中是否具有Test的默認構造函數,而不僅僅是您在此處發佈的代碼版本?我遇到了同樣的錯誤,搜索了一下,嘗試了幾個建議,比如clean/rebuild,添加serialVersionUID,沒有任何工作。然後,我搜索了更多,並找到了一個建議,以確保您嘗試序列化的類具有默認構造函數。我沒有,只要我加了一個,它就起作用了。我不知道爲什麼修復它,但它確實如此。

+1

這是因爲GWT序列化不是Java序列化...在FAQ中進行了解釋:http://code.google.com/intl/fr/webtoolkit/doc/1.6/FAQ_Server.html#Does_the_GWT_RPC_system_support_the_use_of_java.io.Serializable – Vinze 2010-09-27 07:31:44

2

我還添加了一個空的構造函數給我的類有問題,它工作正常。

0

這些都是會導致GWT序列化拋出異常的情況:

1)你的類沒有實現Serializable或IsSerializable。 2)沒有默認構造函數 3)GWT無法將您的類添加到「白名單」,因爲代碼的靜態分析沒有顯示您的類將被包含在RPC中。對於這種情況,我創建了一個「WhiteList」動作/結果RPC對(遵循命令模型),並確保動作對象包含失敗的相關類的成員。有時候你可能會發現一個對象作爲RPC調用的一部分返回到非泛型集合中,並且GWT沒有辦法包含它。在這種情況下,將它添加到「WhiteList」操作類也有幫助。

0

我注意到您的課程位於「com。test .myApp.client.mode」包中,提示它是「測試」類(不屬於您的預期部署)。

您的gwt模塊文件(myApp.get.xml)實際上在com.test.myApp中嗎?

如果是這樣,您選擇的軟件包名稱很差。避免將「測試」放在主包名稱中 - 約定規定這意味着它是一個測試包。

如果沒有,嘗試你的類移動到「主」包,例如「融爲一體。myCompany的 .myApp.client.mode」(假設你獲取模塊文件是com.mycompany.myApp)。

1

我也有與ArrayList相同的問題。我只是添加了一個空的構造函數,它工作。 (我的課已經實現了Serializable)