PDA

View Full Version : [Java] Deserializzazione e attributi transient


wisher
06-09-2008, 15:50
Ciao, io devo deserializzare un oggetto contenente un attributo transient. Il mio problema è che tali attributi non vengono deserializzati (Non essendo stati serializzati). Io però vorrei che questi elementi fossero re-inizializzati subito dopo la deserializzazione.
E' possibile fare ciò in modo 'automatico' o devo scrivere io un metodo da invocare una volta deserializzato l'oggetto? Nel secondo caso non ci sono problemi se non che non mi piace molto l'idea dal punto di vista stilistico.

andbin
06-09-2008, 17:30
Ciao, io devo deserializzare un oggetto contenente un attributo transient. Il mio problema è che tali attributi non vengono deserializzati (Non essendo stati serializzati). Io però vorrei che questi elementi fossero re-inizializzati subito dopo la deserializzazione.
E' possibile fare ciò in modo 'automatico' o devo scrivere io un metodo da invocare una volta deserializzato l'oggetto? Nel secondo caso non ci sono problemi se non che non mi piace molto l'idea dal punto di vista stilistico.Quando un oggetto viene serializzato, i campi transient vengono del tutto ignorati. Quando un oggetto viene deserializzato, il costruttore della classe non viene invocato e così, allo stesso modo, nemmeno gli inizializzatori dei campi e i blocchi di inizializzazione di istanza vengono eseguiti.

Quindi se anche mettessi il campo così, es.:

private transient int pippo = 10;

quando l'oggetto viene deserializzato, al campo pippo non viene assegnato 10, ma rimane al suo valore di "default" (0 per i valori numerici, false per boolean, ecc...)

Se vuoi fare in modo che durante la deserializzazione venga assegnato "qualcosa" di particolare ai campi transient, nella tua classe devi mettere il metodo:

private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException

(nota, è bene che sia 'private', non è un mio errore di scrittura).

Ti basta mettere:
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
stream.defaultReadObject();
tua_var_transient = ......;
}

wisher
07-09-2008, 19:37
Grazie, è proprio quello che mi serve ed è anche una soluzione abbastanza elegante.