2009-04-08 20 views
6

¿Cuál es la forma más sencilla de serializar un bean a una cadena usando GWT? Prefiero no usar GWT.create() invocaciones.Serializar objeto en GWT

+0

¿Qué tipo de cuerda que estas hablando? Una lista de pares "propiedad = valor"? –

+1

Cualquier tipo de cadena, siempre que se pueda convertir de ida y vuelta en la instancia original. –

Respuesta

4

Descargo de responsabilidad: Serializar un frijol en la URL no es una gran idea para GWT. Aprendí que si es necesario poner datos en la URL, debería ser lo menos posible y solo lo necesario para restablecer el estado de la página. Mira cómo Gmail usa sus tokens de historia y verás que es bastante mínimo.

Con esa advertencia fuera del camino:

Para un proyecto GWT trabajé en que simplemente escribió valores del frijol separados por un delimitador. Al volver a leer los valores, utilicé el método String.split() para obtener una matriz. Con esa matriz, asigno los valores nuevamente a las propiedades de frijoles correctas. En el código:

public class Sample { 

    private int a; 
    private boolean b; 
    private String c; 
    //getters and setters for fields not shown 

    public String toHistoryToken(){ 
     return a+"/"+b+"/"+c; 
    } 
    public void fromHistoryToken(String token){ 
     String[] values=token.split("/"); 
     a=Integer.parseInt(values[0]); 
     b=Boolean.parseBoolean(values[1]); 
     c=values[2]; 
    } 
} 

Para complicar más escenarios, puede que tenga que hacer cosas más complicadas. Por ejemplo, para objetos anidados, debe escribir el código para pasar los valores a los objetos secundarios.

Además, tenga en cuenta que debe asegurarse de que los valores que utilice no contengan el delimitador. Por lo tanto, si sabe que sus cadenas podrían contener "/", entonces podría tener que hacer una operación de reemplazo() para escapar de cualquier delimitador anidado.

0

Quizás esto es lo que estás buscando?

Json <-> Java serialization that works with GWT

Extended Version:

El uso de la biblioteca JSON:

http://json-lib.sourceforge.net/

Puede hacerlo (ir a la derecha desde el grano hasta cadena JSON):

http://json-lib.sourceforge.net/snippets.html#Creating_a_JSONObject_from_a_JavaBean

+0

Algo así, pero no quiero escribir Tipos de superposición para todas mis clases (más de 40). Me gustaría una forma simple y no intrusiva de serializar un objeto a una Cadena. –

+0

No intrusivo es relativo, porque considero hacer tipos de superposición para todos los datos que voy a pasar, PERO si quiere una forma de abrirse camino directamente desde un objeto Bean a un objeto de cadena JSON, consulte mi actualización. – Organiccat

+0

Estoy seguro de que el json-lib no funcionará en GWT (del lado del cliente), ya que probablemente utiliza la reflexión a través de BeanInfo. No puedo verificar las fuentes en este momento. –

1

No estoy seguro de entender lo que finalmente está tratando de lograr.

Si realmente solo desea enviar cadenas de ida y vuelta, realmente no necesita hacer nada - lo obtiene de forma gratuita utilizando el mecanismo GWT RPC normal. Simplemente cree un método que devuelva java.lang.String, cree la implementación acompañante y la interfaz Async, y listo.

Si, por otro lado, realmente desea enviar un bean, simplemente asegúrese de que tenga un constructor zero-arg e implemente Serializable o IsSerializable.

+0

Quiero escupir un frijol a una barra de URL, de la manera más fácil posible. –

+0

Como dijo Miguel anteriormente, no hay reflejo en GWT. Tal vez sea mejor que solo escriba un método personalizado "toUrl()". –

0

Puede haber algunos matices de GWT que complican las cosas, pero en general cosas como:

  • datos XML de unión/libs mapeo como JAXB y XStream pueden hacer esto
  • Con JSON, bibliotecas como Jackson puedo hacer unión de frijol completo flexible, similar a JAXB, pero con una configuración aún menor (y una velocidad más rápida si eso es importante).

debería funcionar.

+0

Esto no lo cortará, ya que estas bibliotecas probablemente utilicen el reflejo, que no está disponible en el lado del cliente GWT. –

0

En última instancia, GWT se ejecuta en JavaScript (aunque está escrito en Java). En ese sentido, los "beans Java" no son cosas que encuentres fácilmente en el cliente, pero funcionan bien en el servidor (en Java).

Si acepta que un bean es realmente un objeto sin método, su intención subyacente al usarlos es mover datos. Nativamente en JavaScript, JSON también actúa como un contenedor extremadamente flexible para los datos. En el lado del servidor, una serie de Beans se puede convertir a JSON usando BeanUtils (y un poco de recorrido). JSON se puede serializar en GWT como una cadena, y GWT tiene un analizador para volver a convertir JSON en objetos de JavaScript para el cliente.

Probablemente no sea la forma más fácil de hacerlo, pero es muy flexible una vez que lo hace funcionar.

Cuestiones relacionadas