Java序列化时,静态的成员变量 "可以被拿到数据" 是因为 类加载器之前就把这个类加载好了,拿到的是加载好的数据

    xiaoxiao2025-08-13  6

    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 );

    转载请注明原文地址: https://ju.6miu.com/read-1301695.html
    最新回复(0)