静态变量为什么不能序列化数据,静态变量不能被序列化

  静态变量为什么不能序列化数据,静态变量不能被序列化

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

  写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用

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

  类Student1

  包装测试;

  导入Java。io。可序列化;

  公共类学生1实现可序列化{

  private static final long serialVersionUID=1L;

  私有字符串名称;

  私有临时字符串密码;

  私有静态int count=0;

  公共学生1(字符串名称,字符串密码){

  System.out.println(调用学生的带参构造方法);

  this.name=name

  this.password=密码;

  数数;

  }

  公共字符串toString(){

  返回人数:计数姓名:名称密码:密码;

  }

  }类ObjectSerTest1

  包装测试;

  导入Java。io。文件输入流;

  导入Java。io。文件输出流;

  导入Java。io。io异常;

  导入Java。io。objectinputstream

  导入Java。io。对象输出流;

  公共类对象测试1 {

  公共静态void main(String args[]){

  尝试{

  文件输出流fos=新文件输出流( test。obj’);

  对象输出流OOS=新对象输出流(fos);

  学生1 s1=新学生1(张三,123456);

  学生1 s2=新学生1(王五,56);

  OOS。writeobject(S1);

  OOS。writeobject(S2);

  OOS。close();

  文件输入流fis=新文件输入流( test。obj’);

  ObjectInputStream ois=新的ObjectInputStream(fis);

  学生1 S3=(学生1)ois。read object();

  学生1 S4=(学生1)ois。read object();

  系统。出去。println(S3);

  系统。出去。println(S4);

  ois。close();

  } catch (IOException e) {

  e。printstacktrace();

  } catch(ClassNotFoundException E1){

  E1。printstacktrace();

  }

  }

  }运行结果:

  调用学生的带参构造方法

  调用学生的带参构造方法

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

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

  类Test1

  包装测试;

  导入Java。io。文件输入流;

  导入Java。io。文件输出流;

  导入Java。io。io异常;

  导入Java。io。objectinputstream

  导入Java。io。对象输出流;

  公共类测试1{

  公共静态void main(String args[]){

  尝试{

  文件输入流fis=新文件输入流( test。obj’);

  ObjectInputStream ois=新的ObjectInputStream(fis);

  学生1 S3=(学生1)ois。read object();

  学生1 S4=(学生1)ois。read object();

  系统。出去。println(S3);

  系统。出去。println(S4);

  ois。close();

  } catch (IOException e) {

  e。printstacktrace();

  } catch(ClassNotFoundException E1){

  E1。printstacktrace();

  }

  }

  }运行结果:

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

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

  总结:

  类对象测试一的运行结果显示计数=2,似乎被序列化了,但是类测试一的运行结果显示计数=0并未被序列化。

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

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

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

  重写类测试一读取测试对象显示的结果是数数的初始时的信息,也验证了上面一段话。

  最后,Java对象的静态和瞬态修饰属性不能被序列化。这就是为什么静态变量不能序列化的细节。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: