2010-06-17 12 views
13

Mam usługi RPC z następującą metodą:gwt - Używanie listy <Serializable> w wywołaniu RPC?

public List<Serializable> myMethod(TransactionCall call) {...} 

Ale pojawia się ostrzeżenie, gdy metoda ta jest analizowana, a następnie wywołanie RPC nie

Analyzing 'my.project.package.myService' for serializable types 
Analyzing methods: 
public abstract java.util.List<java.io.Serializable> myMethod(my.project.package.TransactionCall call) 
Return type: java.util.List<java.io.Serializable> 
[...] 
java.io.Serializable 
Verifying instantiability 
(!) Checking all subtypes of Object wich qualify for serialization 

Wygląda na to, że nie mogę użyć Serializable dla mojej listy ... Zamiast tego mógłbym użyć mojego własnego interfejsu (coś takiego jak AsyncDataInterface, który implementuje Serializ w stanie interfejs), ale faktem jest, że moja metoda zwróci listę niestandardowych obiektów i podstawowych obiektów (takich jak ciągi, int ....).

Więc moje pytania to:

  • Czy to zachowanie standart? (Nie mogę się domyślić, dlaczego nie mogę użyć tego interfejsu w tym przypadku)
  • Czy ktoś ma obejście tego typu sytuacji?

Odpowiedz

27

Podczas przekazywania obiektów przez wywołanie RPC warto zadeklarować konkretne typy parametrów w interfejsie RPC. Jeśli z jakiegoś powodu nie możesz użyć konkretnej klasy w interfejsie RPC, staraj się być jak najbardziej konkretny.

Dzieje się tak, ponieważ kompilator GWT emitujący javascript musi uwzględniać wszystkie możliwe warianty List w jednostce kompilacji. Obejmuje to wszystkie klasy rozszerzające interfejs List i Serializable w ścieżce klasy. Permutacje mogą być ogromne, co wpłynie na czas kompilacji, a także rozmiar pobierania aplikacji.

Więc najlepszym rozwiązaniem jest zdefiniowanie interfejsu jako

public ArrayList<YourType> myMethod(TransactionCall call) {...} 

zamiast

public List<Serializable> myMethod(TransactionCall call) {...} 

ten sposób kompilator musi generować jednostki kompilacji tylko ArrayList i YourType rozszerzeń. Benifit jest w szybszym czasie kompilacji i mniejszych skompilowanych plikach javascript, stąd szybsze pobieranie aplikacji.

Jeśli konieczne jest zwrócenie szerokiej gamy niezwiązanych obiektów w wywołaniu RPC, spróbuj utworzyć klasę opakowania i zwrócić obiekt klasy opakowania z zawijaną wartością zwracaną. Użyj klasy opakowania w definicji metody RPC. Oprzyj się pokusie zadeklarowania zawiniętego pola jako Obiekt lub Serializowalne, zanegujesz wszystkie korzyści serializacji, które uzyskałeś korzystając z opakowania. Zamiast tego możesz zdefiniować interfejs Wrapper i mały zestaw implementacji Wrappera dla każdego konkretnego typu, który chcesz powrócić za pośrednictwem wywołania RPC.

1

Możesz chcieć sprawdzić, czy plik polityki serializacji nie jest źródłem problemu.

Quote from GWT documentation:

Jednak jest jeden warunek, aby umożliwić obsługę java.io.Serializable w nowym systemie GWT RPC.

RPC generuje teraz plik polityki serializacji podczas kompilacji GWT. Plik polityki serializacji zawiera białą listę dozwolonych typów, które mogą być serializowane. Jego nazwa to silna nazwa skrótu, po której następuje .gwt.rpc. Aby włączyć obsługę java.io.Serializable, typy, które aplikacja będzie wysyłać przez sieć, muszą być umieszczone na białej liście zasad porządkowania. Ponadto plik polityki serializacji musi zostać wdrożony na serwerze WWW jako zasób publiczny, dostępny z usługi RemoteServiceServlet za pośrednictwem ServletContext.getResource(). Jeśli nie zostanie poprawnie wdrożony, RPC uruchomi się w trybie zgodności 1.3.3 i odmówi serializacji typów implementujących java.io.Serializable.

0

Nie widzę punktu definicji Lista < Serializowalne> jako wartość zwracana. Typ Serializable nie dostarcza żadnych dodatkowych informacji w deklaracji API usługi. GWT i tak sprawdzi sprawdzenie serializacji w środowisku wykonawczym.

W twoim przypadku, gdy elementy listy nie mają wspólnego przodka innego niż Object, użyłbym Listy <?>.

Powiązane problemy