2010-01-22 15 views
5

Lo opuesto a esta pregunta: How do I add a type to GWT's Serialization Policy whitelist?¿Cómo elimino los tipos de implementación de la política de serialización de GWT?

GWT está agregando tipos no deseados a la política de serialización e hinchando mi JS. ¿Cómo recorto mi lista blanca de GWT a mano? ¿O debería en absoluto?

Por ejemplo, si pongo la lista de interfaz en una clase de servicio GWT RPC, GWT tiene que generar Javascript que maneje ArrayList, LinkedList, Stack, Vector, ... aunque mi equipo sabe que solo vamos a hacerlo devolver una ArrayList. Podría simplemente hacer el tipo de retorno del método ArrayList, pero me gusta confiar en una interfaz en lugar de una implementación específica. Después de todo, tal vez un día lo cambiemos y volvamos, p. una LinkedList. En ese caso, me gustaría obligar a la política de serialización de GWT a compilar solo para ArrayList y LinkedList. Sin pilas o vectores.

Estas restricciones implícitas tienen una gran desventaja que puedo pensar: un nuevo miembro del equipo comienza a devolver vectores, lo que será un error de tiempo de ejecución. Entonces, además de la pregunta en el título, ¿cuál es tu experiencia de diseño al respecto?

+0

¿Cuál es su objetivo de diseño? ¿seguridad? ¿actuación? –

+1

Rendimiento, en una palabra: para reducir el tamaño de la JS ahora y en el futuro. Si comenzamos a enviar Conjuntos y Mapas sobre RPC, habrá otra explosión de clase.El otro objetivo es mantener las mejores prácticas de codificación. Si hay un problema de seguridad que no estoy viendo, házmelo saber. – Bluu

+0

Esto me parece que tiene una solución muy simple. Obviamente sabes lo que es eso, como lo dijiste tú mismo. ¿Por qué tomarse tantas molestias tratando de cambiar GWT? Eso parece tonto En el futuro, si alguna vez necesita devolver LinkedList, puede cambiar a una interfaz. Creo que si su objetivo de diseño es el rendimiento, simplemente cambie el tipo de devolución a ArrayList y termine con eso. Mis 2 centavos. –

Respuesta

7

Hay una propiedad que puede hacer esta lista negra de la clase. Por ejemplo, a la lista negra no ArrayList colecciones, añadir estas líneas a su * .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"/> 

Esto era necesario para mí para reducir el tamaño JS cuando se envía de GWT incorporada com.google.gwt.user.client.ui.SuggestOracle$Response objetos a través del cable. Dichos objetos contienen java.util.Collection, pero sabía que solo enviaría una ArrayList.

Todavía respeto las ventajas de las comprobaciones en tiempo de compilación como se discutió en las otras respuestas, comentarios y mi pregunta original. De hecho, esta es una solución escabrosa si GWT comienza a elegir implementaciones adicionales para serializar (¿por qué no es una lista blanca?). Sin embargo, esta propiedad "rpc.blacklist" me salvó de rodar mi propio SuggestOracle solo para obtener un tipo de colección más específico.

6

Si bien ningún buen marco debería intentar cambiar a sus usuarios, permítanme explicar por qué la serialización GWT funciona de la manera en que lo hace. No conozco la mecánica exacta de esto, así que podría estar equivocado, pero esta es la esencia de lo que he visto.

GWT ya elimina el código adicional fuera de las interfaces RPC; por ejemplo, si toma una aplicación sin RPC, puede usar interfaces como Lista y Mapa y Configurar como contenido de corazón, GWT solo incluirá automáticamente el código adicional. implementaciones que realmente usa. ¿Por qué? Porque tiene acceso a su código, y es capaz de atravesar todas las permutaciones visibles del código y podar las clases no utilizadas. Entonces, GWT en realidad no crea explosiones de clase cuando se usan interfaces.

El problema es completamente el RPC. El objetivo de un servicio RPC es que el servidor necesite implementar una interfaz RPC, lo que significa que si la interfaz exige que un método devuelva una lista, el servidor puede devolver cualquier implementación de la lista que desee, siempre que como puede ser serializado.

Ese es el problema: GWT no tiene absolutamente ninguna forma de saber qué implementación de una interfaz usará un servidor, ya sea en tiempo de compilación o en algún momento en el futuro. El código del servidor puede, y en muchos casos se desarrollará, independientemente del código del lado del cliente. Por lo tanto, la única forma de recibir de manera segura un objeto de tipo Lista por cable es conocer de antemano todas las implementaciones posibles.

Cuestiones relacionadas