2016-08-25 2 views
0

Unten ist mein Beispielcode:Java Serialisierung - Objekt modifiziert nach Objekt Schreiben in Datei

public class Hybrid { 
public static void main(String[] args) { 
    Cultivate cultivate1 = new Cultivate(); 
    try{ 
     ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("myfile")); 
     os.writeObject(cultivate1); 
     os.close(); 

     System.out.println("line 1 : "+ ++cultivate1.z+" "); 

     ObjectInputStream is = new ObjectInputStream(new FileInputStream("myfile")); 
     Cultivate cultivate2 = (Cultivate)is.readObject(); 
     is.close(); 

     System.out.println("line 2 : "+cultivate1.y+" "+cultivate2.z); 

    } catch(Exception x){ 
     System.out.println("exc"); 
    } 
} 
} 
class Cultivate implements Serializable{ 
    transient int y=3; 
    static int z = 6; 
} 

und hier ist die Ausgabe:

line 1 : 7 
line 2 : 3 7 

Kann jemand erklären, warum cultivate2.z druckt 7? Der Wert für cultivate1.z wird nach dem Schließen des Ausgabestreams erhöht. Wie spiegelt sich diese Änderung bei der Desialisierung wider?

Antwort

2

Statische Variablen ist nicht serialisiert, also während der Deserialisierung statischer Variablenwert aus der Klasse geladen (aktuelle Wert geladen.)

Hier die JavaDoc von Object.

Der Standard Serialisierungsmechanismus für ein Objekt schreibt die Klasse des Objekts, die Klassensignatur und die Werte aller nicht-transienten und nicht-statischen Felder. Verweise auf andere Objekte (außer in transienten oder statischen Feldern) bewirken, dass diese Objekte auch geschrieben werden. Mehrere Verweise auf ein einzelnes Objekt werden mithilfe eines Verweisfreigabemechanismus codiert, sodass Diagramme von Objekten in der gleichen Form wiederhergestellt werden können, in der das Original geschrieben wurde.

2

z ist ein statisches Feld, d. H. Es handelt sich um ein Feld der Klassenstufe und nicht um ein fallspezifisches Feld.

Statische Variablen gehören zu einer Klasse und nicht zu einer einzelnen Instanz. Das Konzept der Serialisierung befasst sich mit dem aktuellen Zustand des Objekts. Nur Daten, die einer bestimmten Instanz einer Klasse zugeordnet sind, werden serialisiert. Daher werden statische Elementfelder während der Serialisierung ignoriert.

Während der Deserialisierung wird der Wert des statischen Variablenwerts aus der Klasse geladen.