2016-04-26 10 views
6

Ecco un programma di test molto semplice:L'oggetto deserializzato conserva i valori statici?

public class Body implements Serializable { 
    static int bod = 5; 
    int dis = -1; 
    public void show(){ 
     System.out.println("Result: " + bod + " & " + dis); 
    } 
} 

public class Testing { 
    public static void main(String[] args) { 
     Body theBody = new Body(); 
     theBody.show(); 
     try { 
      ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("test.dat")); 
      out.writeObject(theBody); 
      out.close(); 
      ObjectInputStream in = new ObjectInputStream(new FileInputStream("test.dat")); 
      Body bodyDouble = (Body)in.readObject(); 
      in.close(); 
      bodyDouble.show(); 
     } catch(IOException e) { 
     } catch(ClassNotFoundException e) { 
     } 

    } 
} 

Ma io non capisco il motivo per cui la sua uscita è:

Result: 5 & -1 
Result: 5 & -1 

Poiché i membri statici non sono serializzati e quindi ottenere i valori di default mi aspettavo un'altra uscita :

Result: 5 & -1 
Result: 0 & -1 

In che modo l'oggetto deserializzato ha acquisito il valore di campo statico corretto?

Ho creato questa applicazione di test perché ho bisogno di serializzare alcuni oggetti con un numero di campi statici per fare copie profonde (e ovviamente, ho bisogno di essere sicuro che le copie abbiano gli stessi valori dei campi statici poiché sono usati come indici di array).

E ora sono assolutamente confuso su cosa succede dopo la deserializzazione. Da un lato, i membri statici non vengono serializzati ma, d'altro canto, come dimostra l'esempio, i membri statici conservano in qualche modo i loro valori. Sospetto che abbia qualcosa a che fare con la trasmissione di readObject() sull'oggetto Body ma non ne sono sicuro.

+0

http://stackoverflow.com/questions/1008023/how-to-serialize-static-data-members-of-a-java-class – rkosegi

risposta

6

In che modo l'oggetto deserializzato ha acquisito il valore di campo statico corretto?

Perché i valori dei campi statici non sono cambiate tra serializzazione e deserializzazione:

si esegue il test entro il stessa applicazione. Quindi i membri della classe statica mantengono il loro valore. La classe non viene ricaricata o reinizializzata, è sempre la stessa.

Si dovrebbe separare il test in due applicazioni separate:

  • Let un'applicazione serializzare l'oggetto
  • Let un'applicazione deserialize l'oggetto

Quindi eseguire queste due applicazioni uno dopo l'altro. Si vedrà quindi che i membri statici non vengono ripristinati nella seconda applicazione.

In alternativa, nel codice sopra riportato, è anche possibile impostare il campo statico su un valore diverso subito prima della deserializzazione: vedrete che la variabile ha ancora questo valore dopo la deserializzazione.

Nota a margine, non eseguire mai ... catch(IOException e) {} ... - almeno, stampare la traccia di stack con e.printStackTrace().

+0

Grazie. Quindi ho capito bene che, dal momento che ho bisogno di una copia temporanea identica temporanea di un oggetto in fase di esecuzione (senza alcuna applicazione separata), non ho bisogno di preoccuparmi dei campi statici: tutte le copie deserializzate avranno? Cioè perdere i valori statici è fondamentalmente un problema di scambio di oggetti tra diverse applicazioni? – Vic

+0

Sì. Perché la serializzazione riguarda oggetti (istanze di classe), non classi.Questo potrebbe essere utile per il tuo caso d'uso specifico: http://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object-in-java –

Problemi correlati