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
原创粉丝点击