Heim  >  Artikel  >  Java  >  Warum können statische Variablen nicht serialisiert werden?

Warum können statische Variablen nicht serialisiert werden?

anonymity
anonymityOriginal
2019-05-07 09:41:268750Durchsuche

Statische Mitglieder gehören zur Klassenebene und können daher nicht serialisiert werden. Dies bedeutet, dass die serialisierten Informationen dieses statische Mitgliedsfeld nicht enthalten.

Warum können statische Variablen nicht serialisiert werden?

Hier ist ein Beispiel, das zeigt, warum statische Variablen nicht serialisiert werden können:

Klasse Student1

package test;
 
import java.io.Serializable;
 
public class Student1 implements Serializable{
     private static final long serialVersionUID = 1L;
     private String name;
     private transient String password;
     private static int count = 0;
    
     public Student1(String name,String password){
    System.out.println("调用Student的带参构造方法 ");
    this.name = name;
    this.password = password;
    count++;
     }
    
     public String toString(){
    return "人数:" + count + "姓名:" + name + "密码:" + password;
     }
}

Klasse ObjectSerTest1

package test;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
 
public class ObjectSerTest1 {
     public static void main(String args[]){
    try{
    FileOutputStream fos = new FileOutputStream("test.obj");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    
    Student1 s1 = new Student1("张三","123456");
    Student1 s2 = new Student1("王五","56");
    
    oos.writeObject(s1);
    oos.writeObject(s2);
    
    oos.close();
    
    FileInputStream fis = new FileInputStream("test.obj");
    ObjectInputStream ois = new ObjectInputStream(fis);
    Student1 s3 = (Student1) ois.readObject();
             Student1 s4 = (Student1) ois.readObject();
 
             System.out.println(s3);
             System.out.println(s4);
 
             ois.close();
         } catch (IOException e) {
             e.printStackTrace();
         } catch (ClassNotFoundException e1) {
             e1.printStackTrace();
         }
     }
}

Laufergebnis:

Student-Konstruktor mit Parametern aufrufen

Student-Konstruktor mit Parametern aufrufen

Anzahl der Personen: 2 Name: Zhang Sans Passwort: null

Anzahl der Personen: 2 Name: Wang Wu Passwort: null

Klassentest1

package test;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
 
public class Test1{
 
    public static void main(String args[]){
        
        try {
 
            FileInputStream fis = new FileInputStream("test.obj");
            ObjectInputStream ois = new ObjectInputStream(fis);
 
            Student1 s3 = (Student1) ois.readObject();
            Student1 s4 = (Student1) ois.readObject();
 
            System.out.println(s3);
            System.out.println(s4);
 
            ois.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        }
    }    
}

Laufergebnis:

Anzahl der Personen: 0 Name: Zhang San Passwort: null

Anzahl der Personen: 0 Name: Wang Wu Passwort: null

Zusammenfassung:

Klasse ObjectSerTest1 Das laufende Ergebnis zeigt, dass count=2 serialisiert zu sein scheint, aber das laufende Ergebnis der Klasse Test1 zeigt, dass count=0 nicht serialisiert wurde.

" Die Serialisierung speichert den Status des Objekts, und statische Variablen sind der Status der Klasse, sodass die Serialisierung keine statischen Variablen speichert.

Was hier nicht serialisiert werden kann, bedeutet, dass die Informationen nicht serialisiert werden Fügen Sie dieses statische Mitgliedsfeld

ObjectSerTest1 ein. Der Test ist erfolgreich, da sie sich alle auf demselben Computer (und demselben Prozess) befinden, da der JVM bereits die Anzahl geladen hat. Sie erhalten also die geladene Anzahl, wenn Sie übertragen es auf eine andere Maschine oder Sie fahren das Programm herunter und schreiben es neu und schreiben ein Programm zum Lesen von test.obj. Zu diesem Zeitpunkt sind die Zählinformationen der Anfangswert, da andere Maschinen oder neue Prozesse den Zähler neu laden. --- Von der Referenzwebseite

Das Ergebnis, das beim Umschreiben der Klasse Test1 beim Lesen von test.obj angezeigt wird, ist die Anfangsinformation von count, die auch den obigen Absatz überprüft.

Schließlich können statische und vorübergehend geänderte Eigenschaften von Java-Objekten nicht serialisiert werden.

Das obige ist der detaillierte Inhalt vonWarum können statische Variablen nicht serialisiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn