2010-01-22 10 views
5

L'opposto di questa domanda: How do I add a type to GWT's Serialization Policy whitelist?Come rimuovo i tipi di implementazione dalla politica di serializzazione di GWT?

GWT è l'aggiunta di tipi indesiderati alla politica serializzazione e gonfiore mia JS. Come posso tagliare a mano la mia lista bianca GWT? O dovrei assolutamente?

Ad esempio, se inserisco l'elenco di interfaccia su una classe di servizio RPC GWT, GWT deve generare Javascript che gestisca ArrayList, LinkedList, Stack, Vector, ... anche se il mio team sa che avremo solo intenzione di restituisce una lista array. Potrei semplicemente rendere il tipo di ritorno del metodo ArrayList, ma mi piace affidarmi a un'interfaccia piuttosto che a un'implementazione specifica. Dopotutto, forse un giorno lo accenderemo e torneremo ad es. una lista collegata. In tal caso, mi piacerebbe forzare la politica di serializzazione GWT da compilare solo per ArrayList e LinkedList. Niente pile o vettori.

Queste limitazioni implicite hanno uno svantaggio enorme che posso pensare: un nuovo membro del team inizia a restituire Vettori, che sarà un errore di runtime. Quindi, oltre alla domanda nel titolo, qual è la tua esperienza di progettazione intorno a questo?

+0

Qual è il tuo obiettivo di progettazione? sicurezza? prestazione? –

+1

Prestazioni, in una parola: per ridurre le dimensioni del JS ora e in futuro. Se iniziamo a inviare Sets e Maps su RPC, ci sarà un'altra esplosione di classe.L'altro obiettivo è mantenere le migliori pratiche di codifica. Se c'è un problema di sicurezza che non vedo, fammelo sapere. – Bluu

+0

Mi sembra di avere una soluzione molto semplice. Ovviamente sai cosa sia, come hai detto tu stesso. Perché andare così tanto nei guai a cercare di cambiare GWT? Sembra sciocco. In futuro, se dovessi aver bisogno di restituire LinkedList, puoi passare a un'interfaccia. Penso che se il tuo obiettivo di progettazione è il rendimento, cambia semplicemente il tipo di ritorno in ArrayList e fallo con esso. I miei 2 centesimi. –

risposta

7

C'è una proprietà che può fare questa lista nera di classe. Ad esempio, nella lista nera non ArrayList Collezioni, aggiungere queste righe al vostro * .gwt.xml:

<extend-configuration-property name="rpc.blacklist" value="java.util.HashSet"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.LinkedHashSet"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.LinkedList"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.Stack"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.TreeMap"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.TreeSet"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.Vector"/> 

Questa era necessario per me per ridurre le dimensioni JS per l'invio di GWT built-in com.google.gwt.user.client.ui.SuggestOracle$Response oggetti sopra il filo. Tali oggetti contengono un java.util.Collection, ma sapevo che avrei sempre inviato una ArrayList.

Rispetto ancora i vantaggi dei controlli in fase di compilazione come discusso nelle altre risposte, nei commenti e nella mia domanda originale. In effetti, questa è una soluzione traballante se GWT inizia a raccogliere ulteriori implementazioni da serializzare (perché non si tratta di una lista bianca?). Tuttavia questa proprietà "rpc.blacklist" mi ha salvato dal rollare il mio SuggestOracle solo per ottenere un tipo di raccolta più specifico.

6

Mentre nessun framework valido dovrebbe mai provare a cambiare i suoi utenti, provate a spiegare perché la serializzazione GWT funziona come fa. Non conosco la meccanica esatta di questo, quindi potrei sbagliarmi, ma questo è l'essenza di ciò che ho visto.

GWT rimuove già il codice extra al di fuori delle interfacce RPC - ad esempio, se si prende un'app senza RPC, si è liberi di utilizzare interfacce come Elenco e Mappa e Imposta il contenuto del proprio cuore - GWT includerà automaticamente solo il implementazioni che usi effettivamente. Perché? Perché ha accesso al tuo codice ed è in grado di attraversare tutte le permutazioni visibili del codice e di sfoltire le classi inutilizzate. Quindi GWT in realtà non crea esplosioni di classe quando vengono usate le interfacce.

Il problema è interamente RPC. Il punto di un servizio RPC è che il server deve implementare un'interfaccia RPC - il che significa che se l'interfaccia impone che un metodo deve restituire un elenco, il server è libero di restituire qualsiasi implementazione della lista che vuole, a patto che come può essere serializzato.

Questo è il problema: GWT non ha assolutamente modo di sapere quale implementazione di un'interfaccia verrà utilizzata da un server, in fase di compilazione o in futuro. Il codice server può, e in molti casi, essere sviluppato indipendentemente dal codice lato client. Quindi, l'unico modo per ricevere in sicurezza un oggetto di tipo List sul filo è sapere su ogni possibile implementazione di esso in anticipo.

Problemi correlati