Java中的transient关键字

栏目: Java · 发布时间: 6年前

内容简介:之前写过一篇序列化相关的文章,今天要讲的这个文件自transient也是跟序列化有关系的。但是,挺多人没有了解过该关键字甚至是不知道该关键字的存在。在Java中,当一个类实现了java.io.Serializable接口,即表明了该类可以被序列化。我们可以把该类的属性序列化然后保存在外部,或者跟另外一个jvm进行数据传递。但是,我们是否想过,如果一个类包含隐私信息,如用户的密码等,那么这个属性就不能够被序列化到外部。当然,我们可以在序列化之前手动set该值为null,但是最优雅的做法就是使用transien

之前写过一篇序列化相关的文章,今天要讲的这个文件自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);
}
复制代码
Java中的transient关键字

运行结果如下:

Java中的transient关键字

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

静态属性序列化问题

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

给User添加属性count:

private transient static int count;
复制代码
Java中的transient关键字

这是一个静态属性。

先把该属性设置为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());
    }
复制代码
Java中的transient关键字

输出结果如下:

Java中的transient关键字

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

总结

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

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

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Mission Python

Mission Python

Sean McManus / No Starch Press / 2018-9-18 / GBP 24.99

Launch into coding with Mission Python, a space-themed guide to building a complete computer game in Python. You'll learn programming fundamentals like loops, strings, and lists as you build Escape!, ......一起来看看 《Mission Python》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具