2016-04-26 7 views
6

Oto bardzo prosty program testowy:Czy zserializowany obiekt zachowuje wartości statyczne?

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) { 
     } 

    } 
} 

Ale ja nie rozumiem, dlaczego jego wyjście jest:

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

Ponieważ członkowie statyczne nie są szeregowane i stąd dostać domyślne wartości Spodziewałem się innego wyjścia :

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

W jaki sposób zserializowany obiekt uzyskał prawidłową wartość pola statycznego?

Zrobiłem tę aplikację testową, ponieważ muszę serializować kilka obiektów z pewną liczbą pól statycznych, aby wykonać głębokie kopie (i oczywiście muszę mieć pewność, że kopie mają te same wartości pól statycznych ponieważ są używane jako wskaźniki tablicowe).

A teraz jestem całkowicie zdezorientowany, co dzieje się po deserializacji. Z jednej strony, statyczne elementy nie są serializowane, ale z drugiej strony, jak pokazuje przykład, statyczne elementy zachowują swoje wartości. Podejrzewam, że ma to coś wspólnego z odlewaniem readObject() do obiektu Body, ale nie jestem pewien.

+0

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

Odpowiedz

6

W jaki sposób zserializowany obiekt uzyskał prawidłową wartość pola statycznego?

Ponieważ statyczne wartości pól nie uległy zmianie między serializacji i deserializacji:

używasz test w samej aplikacji. Stąd członkowie klasy statycznej zachowują swoją wartość. Klasa sama w sobie nie jest ponownie ładowana ani ponownie inicjowana - wciąż jest taka sama.

Należy oddzielić test w dwóch odrębnych wniosków:

  • Niech jedna aplikacja serialize przedmiotem
  • Niech jedna aplikacja Cofnięcie przedmiotem

Następnie uruchomić te dwie aplikacje jedna po drugiej. Zobaczysz wtedy, że statyczne elementy nie zostaną przywrócone w twojej drugiej aplikacji.

Alternatywnie, w powyższym kodzie, możesz również ustawić pole statyczne na inną wartość tuż przed deserializacją - zobaczysz wtedy, że zmienna nadal ma tę wartość po deserializacji.

Na marginesie, nigdy nie rób ... catch(IOException e) {} ... - przynajmniej wydrukuj ślad stosu za pomocą e.printStackTrace().

+0

Dziękuję. Czy mam rację, skoro potrzebuję tymczasowej identycznej głębokiej kopii obiektu w czasie wykonywania (bez oddzielnej aplikacji), nie muszę się martwić o pola statyczne - wszystkie deserializowane kopie będą je miały? To znaczy. utrata wartości statycznych jest zasadniczo problemem wymiany obiektów pomiędzy różnymi aplikacjami? – Vic

+0

Tak. Ponieważ serializacja dotyczy obiektów (klas instancji), a nie klas.Może to być przydatne w konkretnym przypadku użycia: http://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object-in-java –

Powiązane problemy