2010-06-17 19 views
13

Ich habe einen RPC-Dienst mit dem folgenden Verfahren:gwt - Verwenden der Liste <Serializable> in einem RPC-Aufruf?

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

Aber ich eine Warnung erhalten, wenn diese Methode analysiert wird, und dann schlägt der RPC-Aufruf

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 

Es scheint, ich kann Serializable nicht für meine Liste verwenden ... Ich könnte stattdessen meine eigene Schnittstelle verwenden (etwas wie AsyncDataInterface, das die Serializ implementiert Interface ist), aber meine Methode wird eine Liste von benutzerdefinierten Objekten und Basisobjekten (wie Strings, int ....) zurückgeben.

Also meine Fragen sind:

  • Ist es ein standart Verhalten? (Ich kann nicht herausfinden, warum ich diese Schnittstelle in diesem Fall nicht verwenden kann)
  • Hat jemand eine Abhilfe für diese Art von Situation?

Antwort

27

Bei der Übergabe von Objekten über RPC-Aufruf ist es eine gute Praxis, konkrete Parametertypen in der RPC-Schnittstelle zu deklarieren. Wenn Sie aus irgendeinem Grund keine konkrete Klasse in der RPC-Schnittstelle verwenden können, versuchen Sie, so spezifisch wie möglich zu sein.

Dies liegt daran, dass der GWT-Compiler bei der Ausgabe von Javascript alle möglichen Varianten von List in der Übersetzungseinheit berücksichtigen muss. Dies umfasst alle Klassen, die die listen- und serialisierbare Schnittstelle im Klassenpfad erweitern. Die Permutationen können sehr groß sein, was sich sowohl auf die Kompilierzeit als auch auf die Downloadgröße der Anwendung auswirkt.

So ist der beste Ansatz ist Ihre Schnittstelle als

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

statt

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

Auf diese Weise Compiler für Arraylist und Erweiterungen Yourtype Übersetzungseinheiten nur zu erzeugen, hat zu definieren. Der Vorteil liegt in schnelleren Kompilierzeiten und kleineren kompilierten Javascript-Dateien, daher schnellere Downloads Ihrer Anwendung.

Wenn Sie in Ihrem RPC-Aufruf eine große Anzahl nicht verwandter Objekte zurückgeben müssen, erstellen Sie eine Wrapper-Klasse und geben Sie das Objekt der Wrapper-Klasse mit dem zurückgegebenen Rückgabewert zurück. Verwenden Sie die Wrapper-Klasse in der RPC-Methodendefinition. Widerstehen Sie dem Drängen, das eingepackte Feld als Objekt oder serialisierbar zu deklarieren, Sie werden alle Vorteile der Serialisierung, die Sie durch die Verwendung eines Wrappers erhalten haben, negieren. Stattdessen können Sie für jeden konkreten Typ, den Sie über Ihren RPC-Aufruf zurückgeben möchten, eine Wrapper-Schnittstelle und eine kleine Wrapper-Implementierung definieren.

1

Sie möchten überprüfen, ob die Serialisierungsrichtliniendatei nicht die Ursache des Problems ist.

Quote from GWT documentation:

Allerdings gibt es eine Bedingung Unterstützung in dem neuen GWT RPC-System für java.io.Serializable zu ermöglichen.

RPC generiert jetzt eine Serialisierungsrichtliniendatei während der GWT-Kompilierung. Die Serialisierungsrichtliniendatei enthält eine Whitelist zulässiger Typen, die serialisiert werden können. Sein Name ist ein starker Hash-Name gefolgt von .gwt.rpc. Um die Unterstützung für java.io.Serializable zu aktivieren, müssen die Typen, die Ihre Anwendung über die Leitung senden soll, in die Positivliste für die Serialisierungsrichtlinie aufgenommen werden. Außerdem muss die Serialisierungsrichtliniendatei als öffentliche Ressource auf Ihrem Webserver bereitgestellt werden, auf die von einem RemoteServiceServlet über ServletContext.getResource() zugegriffen werden kann. Wenn sie nicht ordnungsgemäß bereitgestellt wird, wird RPC im Kompatibilitätsmodus 1.3.3 ausgeführt und die Serialisierung von Typen, die java.io.Serializable implementieren, wird abgelehnt.

0

Ich sehe nicht den Punkt der Definition von Liste < Serializable> als Rückgabewert. Der Typ Serializable liefert keine zusätzlichen Informationen in der Service-API-Deklaration. GWT wird die Serialisierung trotzdem zur Laufzeit überprüfen.

In Ihrem Fall, wo die Listenelemente keinen gemeinsamen Vorfahren außer Objekt haben, würde ich die Liste <?> Verwenden.