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

本文通过一个简单的Demo展示了Java序列化中关于static变量的一个常见误解。实际上,static变量并不参与序列化过程,但在某些情况下看似被序列化了。这是因为序列化后的对象在同一个JVM进程中读取时,会获取到已加载的静态变量值。跨进程或跨机器反序列化时,则无法获取这些值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值