2012-12-19 62 views
7

發送使用RPC和Java泛型的對象列表時,發生SerializationException錯誤。GWT和泛型

我創建這個小工具來顯示錯誤:

public class Test<T> { 

    ListDataProvider<T> ldp = new ListDataProvider<T>(); 

    public void setItems(List<T> list){ 
     for(T t :list){ 
      ldp.getList().add(t); 
     } 
    } 

    public List<T> getItems(){ 
     return ldp.getList(); 

    } 

} 

這是代碼來創建測試窗口小部件和傳球的POJO(其中ExporterFormKey是POJO對象)

List<ExporterFormKey> list = new ArrayList<ExporterFormKey>(); 
ExporterFormKey key = new ExporterFormKey(); 
key.setKey("key1"); 
list.add(key); 

Test<ExporterFormKey> test = new Test<ExporterFormKey>(); 
test.setItems(list); 
列表

在結束的下一個代碼拋出一個SerializationException:

service.sendList(test.getList(), new AsyncCallback...); 

而下一一個不罰款:

service.sendList(list, new AsyncCallback...); 

-----編輯----

我發現,做的是找出代碼也可以

List<ExporterFormKey> newList = new ArrayList<ExporterFormKey>(); 
newList.add(test.getItems().get(0)); 
service.sendList(newList , new AsyncCallback...); 

或者這也適用

List<ExporterFormKey> newList = new ArrayList<ExporterFormKey>(test.getItems()); 

我也在測試作品中發現此更改!

public List<T> getItems(){ 
    return new ArrayList<T>(ldp.getList()); 
} 
+0

您可能必須使用強制使用test.getList()來鍵入List 或聲明測試。 – SSR

+1

可能你的ListDataProvider ()沒有返回一個ArrayList,而是List的另一個實現(例如一個Collections.unmodifiableList()返回的列表或一個AbstractList派生類型。你可以發佈完整的SerializationException和服務器日誌嗎?它應該說爲什麼序列化失敗,哪個是違規類 – izaera

回答

1

http://blog.rubiconred.com/2011/04/gwt-serializationexception-on-rpc-call.html

作爲izaera建議ListDataProvider使用不能被通過線路直接發送不可序列列表實現(ListWrapper)。

如您在文章中所建議的那樣,將來自ListDataProvider的getList()方法的響應封裝到新的ArrayList中是解決問題的最簡單方法。

+0

如果有人在這裏訪問的答案,上面的鏈接現在已經死了,並返回404。該頁面似乎也沒有被緩存。 – JRSofty