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