|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: May 2014
Messaggi: 63
|
[JAVA] Problema serializzazione parametrizzata
Salve, ho un problema con la serializzazione in java: in sostanza ho una classe "Serializzatore" che dispone di due metodi statici, "serialize" e "deserialize", che ricevono come parametri il nome del file su/da cui salvare e l'oggetto da (de)serializzare. Tuttavia, la deserializzazione sembra non funzionare. Questo è il codice:
Codice:
public class Serializzatore{ ... public static <E> boolean deserialize(String filename, E objectToSave){ boolean done; try{ ObjectInputStream stream = new ObjectInputStream(new FileInputStream(filename)); try { objectToSave = ((E)stream.readObject()); } catch (ClassNotFoundException e){ done = false; } stream.close(); done = true; } catch(FileNotFoundException e) { done = false; } catch(IOException e) { done = false; } return done; } public static void main(String args[]){ Integer a = 3; Serializzatore.serialize("ser.bin", a); a = 1; Serializzatore.deserialize("ser.bin",a); System.out.println(a); //Dovrebbe dare 3, invece dà 1 } } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2775
|
Non è una questione di deserializzazione, semplicemente hai passato a per riferimento ma poi nel metodo non usi il riferimento ma lo sovrascrivi. D'altra parte gli oggetti Integer sono immutabili quindi non avresti comunque potuto modificare l'oggetto.
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: May 2014
Messaggi: 63
|
Ma quindi il problema dov'è? Devo prima istanziare un nuovo integer passandogli come argomento l'oggetto deserializzato e poi farci puntare "a"? Non capisco perchè dici che non uso il riferimento. Che io sappia "a" stesso è un riferimento (nel senso che si riferisce a qualcosa, punta), come se fosse un puntatore C, con quell'istruzione dovrei semplicemente farlo puntare ad un oggetto diverso, ma il puntatore resta sempre quello, no?
Ultima modifica di Hybr1d97 : 06-03-2015 alle 22:29. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2775
|
Ho provato a fare un disegno perché mi sembrava più facile da spiegare... Come vedi nello stack "a" contiene un riferimento all'oggetto Integer con valore 1. Contiene il riferimento, non l'oggetto. Quando chiami deserialize viene allocato nuovo spazio nello stack e, tra le altre cose, viene assegnato a "objectToSave" lo stesso valore che era contenuto in a cioè un riferimento all'oggetto Integer nello heap.
Il disegno si ferma qui. Ora, quando in deserialize viene eseguita l'istruzione Codice:
objectToSave = ((E)stream.readObject()); - l'Integer puntato da a non viene toccato - il valore di a (cioè il riferimento all'integer) non viene toccato |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: May 2014
Messaggi: 63
|
Ah
![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2775
|
Io risolverei cambiando la firma del metodo, potresti restituire l'oggetto deserializzato invece del boolean. Perderesti il boolean però d'altra parte se qualcosa va male potresti restituire null.
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: May 2014
Messaggi: 63
|
Risolto! Grazie mille
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:21.