Java中的transient关键字

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

内容简介:之前写过一篇序列化相关的文章,今天要讲的这个文件自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修饰,均不能被序列化。


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

查看所有标签

猜你喜欢:

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

迎接互联网的明天

迎接互联网的明天

邹静 / 电子工业 / 2011-6 / 55.00元

《迎接互联网的明天-玩转3D Web(附盘)》,全书共5章,第1章主要阐述了国内外空前繁荣的3D互联网技术领域,以及这些领域透射出来的潜在商机;第2章主要用当下比较流行的Flash编程语言ActionScript 3,来向大家介绍面向对象编程语言的思想概念,以及一些3D渲染技术的入门知识;第3章注重建模知识的运用,主要运用WireFusion和3ds Max来制作3D网页;第4章主要介绍3D游戏编......一起来看看 《迎接互联网的明天》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具