关于transient和static的序列化和反序列化

    做java开发有段时间了,最近没那么忙了,抽了点时间看了下java的源码 。

    在读源码的时候看到了一个 transient 修饰的变量 ,字面意思是瞬变的。在以前的开发过程中也没用到过这个修饰语,查了一下这个修饰语的作用为使被 transient 修饰的变量在序列化的时候不会被

保存到文件中,也就是通过序列化后再被反序列化后读取这个变量不会有值,下面是演示实例


  实体类:
  public class User implements Serializable{
        private static final long serialVersionUID = 1L;
        private String name;
        private transient String password;   //被transient修饰的变量
        private static String age;
      
  }

  测试类:

  public class Test {
    
      public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException {
          User user = new User();
          user.setAge("22");
          user.setName("小明");
          user.setPassword("admin");
          System.out.println(user.getAge()+"\t"+user.getName()+"\t"+user.getPassword());
          ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e:/user.txt"));
          oos.writeObject(user);
          oos.flush();
          oos.close();
        
          ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:/user.txt"));
          User users = (User) ois.readObject();
        
          System.out.println(users.getAge()+"\t"+users.getName()+"\t"+users.getPassword());
      }
  }

从运行结果可以看出用  transient 修饰的变量在反序列化后值为 null

 被static修饰的变量应该也是不会被序列化的,因为只有堆内存会被序列化.所以静态变量会天生不会被序列化。

那这里被static修饰的变量反序列化后有值又是什么鬼 这是因为    静态变量在方法区,本来流里面就没有写入静态变量,我们打印静态变量当然会去方法区查找,我们当前 jvm 中有所以静态变量在序列化后任然有值。

  接着进行对 static  修饰的变量的验证:

public class Test {
    
    public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException {
        User user = new User();
        user.setAge("22");
        user.setName("小明");
        user.setPassword("admin");
        System.out.println(user.getAge()+"\t"+user.getName()+"\t"+user.getPassword());
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e:/user.txt"));
        user.setAge("33"); //在序列化后在对static修饰的变量进行一次赋值操作
        oos.writeObject(user);
        oos.flush();
        oos.close();
        
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:/user.txt"));
        User users = (User) ois.readObject();
        
        System.out.println(users.getAge()+"\t"+users.getName()+"\t"+users.getPassword());
        
    }
}

运行结果如下:

    可以看到在序列化前 static 修饰的变量赋值为22,而反序列化后读取的这个变量值为33,由此可以看出 static 修饰的变量本身是不会被序列化的

  我们读取的值是当前jvm中的方法区对应此变量的值,所以最后输出的值为我们对static 变量后赋的值

 

      以上代码只是测试代码,有逻辑上的问题还望大家见谅。

转载于:https://www.cnblogs.com/xiaoxiaole/p/7457788.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值