2009-04-08 29 views
6

Qual è il modo più semplice per serializzare un bean su una stringa utilizzando GWT? Preferisco non utilizzare le chiamate GWT.create().Serialize Object in GWT

+0

Che tipo di stringa stai parlando? Un elenco di coppie "proprietà = valore"? –

+1

Qualsiasi tipo di stringa, purché possa essere convertita avanti e indietro nell'istanza originale. –

risposta

4

Disclaimer: La serializzazione di un bean nell'URL non è una grande idea per GWT. Ho imparato che se è necessario inserire dati nell'URL, dovrebbe essere il meno possibile e solo ciò che è necessario per ripristinare lo stato della pagina. Guarda come Gmail utilizza i token della cronologia e vedrai che è piuttosto minimale.

Con quella dichiarazione di non responsabilità fuori strada:

Per un progetto GWT ho lavorato ho semplicemente scritto fuori i valori del chicco separati da un delimitatore. Durante la lettura dei valori, ho usato il metodo String.split() per ottenere un array. Con questo array, restituisco i valori alle proprietà del bean corrette. Nel codice:

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]; 
    } 
} 

Per scenari più complicati potrebbe essere necessario fare cose più complicate. Ad esempio, per gli oggetti nidificati, è necessario scrivere il codice per passare i valori agli oggetti figlio.

Inoltre, tenere presente che è necessario assicurarsi che tutti i valori utilizzati non contengano il delimitatore. Quindi, se sai che le tue stringhe potrebbero contenere "/", potresti dover eseguire un'operazione replace() per sfuggire a qualsiasi delimitatore nidificato.

0

Forse questo è quello che stai cercando?

Json <-> Java serialization that works with GWT

Extended Version:

Utilizzando la libreria JSON-lib:

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

Si può fare questo (andando a destra dal chicco alla stringa JSON):

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

+0

Qualcosa del genere, ma non voglio scrivere i tipi di sovrapposizione per tutte le mie classi (40+). Mi piacerebbe un modo semplice e non intrusivo per serializzare un oggetto su una stringa. –

+0

Non intrusivo è relativo, perché considero i tipi di sovrapposizione per tutti i dati che sto per passare, MA se vuoi un modo per passare direttamente da un oggetto Bean a un oggetto stringa JSON, controlla il mio aggiornamento. – Organiccat

+0

Sono sicuro che il json-lib non funzionerà in GWT (lato client), perché probabilmente usa il reflection tramite BeanInfo. Non posso controllare le fonti adesso. –

1

Non sono sicuro di capire cosa stai cercando di realizzare.

Se si desidera solo inviare stringhe avanti e indietro, non è necessario eseguire lo nulla - lo si ottiene gratuitamente utilizzando il normale meccanismo GWT RPC. Basta creare un metodo che restituisca un java.lang.String, creare l'implementazione accompagnatoria e l'interfaccia Async, e il gioco è fatto.

Se invece si desidera inviare un bean, accertarsi che abbia un costruttore di zero-arg e implementa Serializable o IsSerializable.

+0

Voglio sputare un bean in una barra degli URL, nel modo più semplice possibile. –

+0

Come ha detto sopra Miguel, non c'è alcuna riflessione in GWT. Forse starai meglio scrivendo un metodo personalizzato "toUrl()". –

0

Ci possono essere alcune sfumature di GWT che complicano le cose, ma in generale le cose come:

  • dati XML binding/librerie di mappatura come JAXB e XStream possono fare questo
  • Con JSON, librerie come Jackson può fare binding flessibile del bean completo, simile a JAXB, ma con ancora meno configurazione (e velocità più veloce se questo è importante).

dovrebbe funzionare.

+0

Questo non lo taglierà poiché queste librerie probabilmente usano il reflection, che non è disponibile sul lato client GWT. –

0

In definitiva GWT è in esecuzione in JavaScript (anche se è scritto in Java). In questo senso, i "java bean" non sono cose che si trovano facilmente nel client, ma funzionano bene nel server (in Java).

Se si accetta che un bean è in realtà solo un oggetto senza metodo, l'intento di base per il loro utilizzo è lo spostamento dei dati. Nativamente in JavaScript, JSON funge anche da contenitore estremamente flessibile per i dati. Sul lato server una serie di bean può essere convertita in JSON usando BeanUtils (e un po 'di attraversamento). JSON può essere serializzato in GWT come stringa e GWT ha un parser per convertire JSON in oggetti JavaScript per il client.

Probabilmente non è il modo più semplice per farlo, ma è molto flessibile una volta che funziona.