• Java中的transient关键字


    前言

    之前写过一篇序列化相关的文章,今天要讲的这个文件自transient也是跟序列化有关系的。但是,挺多人没有了解过该关键字甚至是不知道该关键字的存在。

    transient关键字介绍

    在Java中,当一个类实现了java.io.Serializable接口,即表明了该类可以被序列化。我们可以把该类的属性序列化然后保存在外部,或者跟另外一个jvm进行数据传递。但是,我们是否想过,如果一个类包含隐私信息,如用户的密码等,那么这个属性就不能够被序列化到外部。当然,我们可以在序列化之前手动set该值为null,但是最优雅的做法就是使用transient关键字。

    在我们不想序列化到外部的属性前面加上transient关键字,该属性将不会被序列化。

    代码测试

    假设我们有User对象如下:

    @Data
    public class User implements Serializable {
    
        private String username;
    
        private transient String password;
    
    }
    

    通过序列化工具类序列化和反序列化:

    @Test
    public void test() {
        User user = new User();
        user.setUsername("happyjava");
        user.setPassword("123456");
        System.out.println("序列化之前:" + user.toString());
        byte[] serialize = SerializationUtils.serialize(user);
        User newUser = SerializationUtils.deserialize(serialize);
        System.out.println("反序列化:" + newUser);
    }
    

    运行结果如下:

    通过结果可以看到,反序列化之后没有存在password字段,这反向的证明了序列化的时候没有把password参与到序列化中去。这正是transient关键字的用处。

    静态属性序列化问题

    可能有读者会想到,如果静态属性加上transient会怎么样?反序列化回来之后是不是该类的静态属性就编程null了?下面通过代码来验证下:

    给User添加属性count:

      private transient static int count;
    

    这是一个静态属性。

    先把该属性设置为10,然后序列化、反序列化一个类,再查看该静态属性:

        @Test
        public void test() {
            User user = new User();
            User.setCount(10);
            user.setUsername("happyjava");
            user.setPassword("123456");
            System.out.println("序列化之前:" + user.toString());
            System.out.println("user count:"+User.getCount());
            byte[] serialize = SerializationUtils.serialize(user);
            User newUser = SerializationUtils.deserialize(serialize);
            System.out.println("反序列化:" + newUser);
            System.out.println("user count:" + User.getCount());
        }
    

    输出结果如下:

    从结果看,静态属性没有发生改变。其实,不管有没有加transient关键字,静态属性都不会被序列化。

    总结

    1)一旦变量被transient修饰,变量将不再是对象持久化的一部分。

    2)transient关键字只能修饰变量,而不能修饰方法和类。

    3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。

  • 相关阅读:
    Django + uWSGI + Nginx 实现生产环境部署
    面试题(一)
    Python基础之路
    Tornado之实例和扩展
    Scrapy源码研究前戏
    算法之基本概念
    RedHat6.2系统安装ipvsadm+keepalived
    oracle11G 同时支持IPV4和IPV6配置
    redhat6.5 安装oracle11G
    python解析字体反爬
  • 原文地址:https://www.cnblogs.com/happy4java/p/11206471.html
Copyright © 2020-2023  润新知