Maison > Java > javaDidacticiel > le corps du texte

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

anonymity
Libérer: 2020-09-10 15:32:19
original
8754 Les gens l'ont consulté

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;
     }
}
Copier après la connexion

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();
         }
     }
}
Copier après la connexion

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();
        }
    }    
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal