静态变量为什么不能序列化

互联网 19-5-7
静态成员属于类级别的,所以不能序列化,这里的不能序列化的意思,是序列化信息中不包含这个静态成员域

这里有一个示例很好的证明了静态变量为什么不能序列化:

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

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

运行结果:

调用Student的带参构造方法

调用Student的带参构造方法

人数:2姓名:张三密码:null

人数:2姓名:王五密码:null

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

运行结果:

人数:0姓名:张三密码:null

人数:0姓名:王五密码:null

总结:

类ObjectSerTest1 的运行结果显示count=2,似乎被序列化了,但是类Test1的运行结果显示count=0并未被序列化。

”序列化保存的是对象的状态,静态变量数以类的状态,因此序列化并不保存静态变量。

这里的不能序列化的意思,是序列化信息中不包含这个静态成员域

ObjectSerTest1 测试成功,是因为都在同一个机器(而且是同一个进程),因为这个jvm已经把count加载进来了,所以你获取的是加载好的count,如果你是传到另一台机器或者你关掉程序重写写个程序读入test.obj,此时因为别的机器或新的进程是重新加载count的,所以count信息就是初始时的信息。“-----来自参考网页

重写类Test1读取test.obj显示的结果是count的初始时的信息,也验证了上面一段话。

最后,Java对象的static,transient 修饰的属性不能被序列化。

以上就是静态变量为什么不能序列化的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 静态变量
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:30岁学java怎么样?

相关资讯