Maison >Java >javaDidacticiel >Pourquoi les variables statiques ne peuvent-elles pas être sérialisées ?

Pourquoi les variables statiques ne peuvent-elles pas être sérialisées ?

anonymity
anonymityoriginal
2019-05-07 09:41:268801parcourir

Les membres statiques appartiennent au niveau classe, ils ne peuvent donc pas être sérialisés. Ce qui ne peut pas être sérialisé ici signifie que les informations sérialisées ne contiennent pas ce champ de membre statique

Pourquoi les variables statiques ne peuvent-elles pas être sérialisées ?

<.>Voici un exemple qui montre pourquoi les variables statiques ne peuvent pas être sérialisées :

Class 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;
     }
}

Class 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();
         }
     }
}

Résultat de l'exécution :

Appeler le constructeur de l'étudiant avec des paramètres

Appeler le constructeur de l'étudiant avec des paramètres

Nombre de personnes : 2 Nom : Mot de passe de Zhang San : null

Nombre de personnes : 2 Nom : Wang Wu Mot de passe : null

Test de classe 1

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();
        }
    }    
}

Résultat de l'exécution :

Nombre de personnes : 0 Nom : Zhang San Mot de passe : null

Nombre de personnes : 0 Nom : Wang Wu Mot de passe : null

Résumé :

Class ObjectSerTest1 Le résultat en cours d'exécution montre que count=2, qui semble être sérialisé, mais le résultat en cours d'exécution de la classe Test1 montre que count=0 n'a pas été sérialisé.

" La sérialisation enregistre l'état de l'objet, et les variables statiques sont l'état de la classe, donc la sérialisation n'enregistre pas les variables statiques.

Ce qui ne peut pas être sérialisé ici signifie la sérialisation. Les informations ne le sont pas. incluez ce champ de membre statique

ObjectSerTest1. Le test est réussi car ils sont tous sur la même machine (et le même processus), car la jvm a déjà chargé le nombre, donc ce que vous obtenez est le nombre chargé, si vous le transférez sur une autre machine ou vous fermez le programme et le réécrivez et écrivez un programme pour lire test.obj, à ce moment-là, parce que d'autres machines ou de nouveaux processus rechargent le décompte, les informations de décompte sont la valeur initiale "---. -- Depuis la page Web de référence

Le résultat affiché par la classe de réécriture Test1 lors de la lecture de test.obj est l'information initiale de count, qui vérifie également le paragraphe ci-dessus.

Enfin, les propriétés modifiées statiques et transitoires des objets Java ne peuvent pas être sérialisées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn