Java序列化时,静态的成员变量 "可以被拿到数据" 是因为 类加载器之前就把这个类加载好了,拿到的是加载好的数据
来源:互联网 发布:淘宝大数据 实体店 编辑:程序博客网 时间:2024/06/18 16:52
Java序列化的时候两种成员变量不能被序列化 一种是static 的还有一种是 transient的。
但是当笔者写了一个demo的时候,发现,"静态的成员变量居然可以拿到"。
demo的代码如下
package com.java;import java.io.*;/** * Created by HuLuo on 2016/8/15. */public class Hello{ public static void main(String[] args) throws IOException, ClassNotFoundException { User user = new User(); FileOutputStream fileOutputStream = new FileOutputStream( "helloworld.txt" ); ObjectOutputStream objectOutputStream = new ObjectOutputStream( fileOutputStream ); objectOutputStream.writeObject( user ); FileInputStream fileInputStream = new FileInputStream( "helloworld.txt" ); ObjectInputStream objectInputStream = new ObjectInputStream( fileInputStream ); User user1 = (User) objectInputStream.readObject(); System.out.println(user1); }}class User implements Serializable{ String name; static String password; transient int age; public User() { this.name = "张三"; this.password = "密码"; this.age = 23; } @Override public String toString() { return name + "+++++" + password + "+++++" + age; } private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); }}
其实static的静态成员变量是不能被序列化这个观点是正确的,
造成可以拿到static序列化之后的假象是因为static 属于类的,得到的是JVM已经加载好的Class的static变量的值,
当你重开一个进程或者在另一个机器上反序列化的时候,就得不到static的值了
将我上面的代码如下的部分注释掉,重新运行即可得到验证。
// User user = new User();//// FileOutputStream fileOutputStream = new FileOutputStream( "helloworld.txt" );//// ObjectOutputStream objectOutputStream = new ObjectOutputStream( fileOutputStream );//// objectOutputStream.writeObject( user );
0 0
- Java序列化时,静态的成员变量 "可以被拿到数据" 是因为 类加载器之前就把这个类加载好了,拿到的是加载好的数据
- 从接口拿到数据是<null>,项目就崩的问题
- android camera2 拿到的yuv420数据到底是什么样的?
- Activity被回收之后怎么拿到之前的数据
- android中的类加载和静态成员变量的初始化
- combobox 加载数据后,点不动的原因 是因为没有 设置 valueField 和 textField
- java 中类初始化,构造方法,静态成员变量,静态块的加载顺序
- 删除的数据被恢复!原来是因为这个啊
- 结合上面的五个例子,对类的静态成员变量和成员函数作个总结: 一。静态成员函数中不能调用非静态成员。 二。非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对象产生之前就已经存在了,所
- 静态变量的加载
- 加载数据之前的加载等待中效果
- Java类加载过程后,成员变量的初始化。
- AJax 把拿到的后台数据在页面中渲染
- Java的静态变量,成员变量,静态代码块,构造块的加载顺序
- [公共类+静态属性]实现同步调用主窗体加载好的数据集
- 对象是从xib/storybard加载的时候,就会调用这个方法initWithCoder:(NSCoder *)aDecoder
- java在怎么拿到另外一个类的私有变量
- vmware虚拟机从A点恢复到之前的snapshot点之后,A点的数据还可以拿到
- 我所认识的EXT2(二)
- Java入门_学习笔记[4]_继承
- leetcode 374 Guess Number Higher or Lower C++
- leetcode 383. Ransom Note
- HDU 1491 Octorber 21st
- Java序列化时,静态的成员变量 "可以被拿到数据" 是因为 类加载器之前就把这个类加载好了,拿到的是加载好的数据
- 字体属性及测量(FontMetrics)
- 单例模式(懒汉,饿汉)
- SQL三表连接查询与集合的并、交、差运算查询
- 手动调整KVM镜像image的disk磁盘大小
- Warning:Conflict with dependency 'com.android.support:support-annotations'问题解决
- leetcode 283. Move Zeroes
- HDU 2111Saving HDU
- ViewPager添加动画效果