静态变量为什么不能序列化数据,静态变量不能被序列化
静态成员属于类级别的,所以不能序列化,这里的不能序列化的意思,是序列化信息中不包含这个静态成员域
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
这里有一个示例很好的证明了静态变量为什么不能序列化:
类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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。