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
risposta
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.
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
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. –
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
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. –
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
.
Voglio sputare un bean in una barra degli URL, nel modo più semplice possibile. –
Come ha detto sopra Miguel, non c'è alcuna riflessione in GWT. Forse starai meglio scrivendo un metodo personalizzato "toUrl()". –
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.
Questo non lo taglierà poiché queste librerie probabilmente usano il reflection, che non è disponibile sul lato client GWT. –
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.
Il più vicino che ho trovato è stato questo:
Faster GWT startup with objects embedded in the HTML host page
Che tipo di stringa stai parlando? Un elenco di coppie "proprietà = valore"? –
Qualsiasi tipo di stringa, purché possa essere convertita avanti e indietro nell'istanza originale. –