Home > Java > javaTutorial > Why can't static variables be serialized?

Why can't static variables be serialized?

anonymity
Release: 2020-09-10 15:32:19
Original
8791 people have browsed it

Static members belong to the class level, so they cannot be serialized. What cannot be serialized here means that the static member field is not included in the serialization information.

Why can't static variables be serialized?

Here is an example that demonstrates why static variables cannot be serialized:

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;
     }
}
Copy after login

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

Run result:

Call Student’s constructor with parameters

Call Student’s constructor with parameters

Number of people: 2 Name: Zhang San’s password: null

Number of people: 2 Name: Wang Wu Password: null

Class Test1

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

Run result:

Number of people: 0 Name: Zhang San Password: null

Number of people: 0 Name: Wang Wu Password: null

Summary:

Class ObjectSerTest1 The running result shows that count=2, which seems to be serialized, but the running result of class Test1 shows that count=0 has not been serialized.

"Serialization saves the state of the object, and static variables are the state of the class, so serialization does not save static variables.

The meaning of "cannot be serialized" here is serialization The information does not include this static member field

ObjectSerTest1. The test is successful because they are all on the same machine (and the same process), because the jvm has already loaded count, so what you get is the loaded count, if you transfer it to another machine or you close the program and rewrite it and write a program to read test.obj, at this time, because other machines or new processes reload the count, the count information is the initial value. Information. "----- From the reference webpage

Rewrite class Test1 reads test.obj and the result displayed is the initial information of count, which also verifies the above paragraph.

Finally, static and transient modified properties of Java objects cannot be serialized.

The above is the detailed content of Why can't static variables be serialized?. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template