2012-12-19 21 views
7

Występuje błąd SerializationException podczas wysyłania listy obiektów za pomocą RPC i Java Generics.GWT i Generics

Tworzę ten widget, aby pokazać błąd:

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(); 

    } 

} 

jest to kod do tworzenia widget test i przekazując listę POJOs (gdzie ExporterFormKey obiektem 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); 

Pod koniec następnego kodu rzuca SerializationException:

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

Podczas następnego jeden robi dobrze:

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

----- Edit ----

Okazało się, że robi następny kod działa również

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

Albo ten działa również

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

Znalazłem tę zmianę w teście działa!

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

Być może trzeba będzie rzucić test.getList(), aby wpisać List lub Declare Test z . – SSR

+1

Prawdopodobnie twój ListDataProvider () nie zwraca tablicy ArrayList, ale innej implementacji listy (na przykład zwróconej listy Collections.unmodifiableList() lub typu pochodnego AbstractList. Czy mógłbyś opublikować pełny wyjątek SerializationException i log serwera? serializacja nie działa, a która jest klasą obraźliwą – izaera

Odpowiedz

1

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

Jak izaera zaproponował ListDataProvider używa non-zaszeregować wdrożenie listy (ListWrapper), które nie mogą być przesyłane bezpośrednio po drugiej stronie drutu.

Owijanie odpowiedzi z metody getList() z ListDataProvider do nowej tablicy ArrayList, zgodnie z sugestią zawartą w poście, to najprostszy sposób obejścia problemu.

+0

Jeśli ktoś tu odwiedzi odpowiedź, powyższy link jest już martwy i zwraca 404. Strona również nie wydaje się być buforowana. – JRSofty