前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java transient关键字解析

Java transient关键字解析

作者头像
java干货
发布2021-02-17 17:29:57
4950
发布2021-02-17 17:29:57
举报
文章被收录于专栏:java干货

前言

最近在看hsweb-framework项目,看到了对象属性有用transient关键字修饰,工作两年的我一脸懵逼,特意查阅了一下这个修饰符的意思,并记录下来!

Account.java

代码语言:javascript
复制
``` java
package com.winwill.simple.test;
import java.io.Serializable;
/**
 * @author qifuguang
 * @date 16-6-23
 */
public class Account implements Serializable {
    private String userId;
    private String password;
    public Account(String userId, String password) {
        this.userId = userId;
        this.password = password;
    }
    public String getPassword() {
        return password;
    }
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}
```

TransientTest.java

代码语言:javascript
复制
``` java
package com.winwill.simple.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
 * @author qifuguang
 * @date 16-6-23
 */
public class TransientTest {
    private static final String ACCOUNT_SERIALIZE_FILE_PATH = "/home/winwill2012/account";
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Account account = new Account("winwill2012", "168");
        System.out.println("原始数据:");
        System.out.println("userId: " + account.getUserId());
        System.out.println("password: " + account.getPassword());
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(ACCOUNT_SERIALIZE_FILE_PATH));
        os.writeObject(account);
        os.flush();
        os.close();
        ObjectInputStream is = new ObjectInputStream(new FileInputStream(ACCOUNT_SERIALIZE_FILE_PATH));
        Account recoverAccount = (Account) is.readObject();
        is.close();
        System.out.println("从文件恢复:");
        System.out.println("userId: " + recoverAccount.getUserId());
        System.out.println("password: " + recoverAccount.getPassword());
    }
}
```

上面代码的大概逻辑就是:

先创建一个Account对象(实现了Serializable接口),这个对象有两个属性:用户名和密码,然后将改对象序列化写到文件,最后再从文件反序列化回来,前后两次打印account的信息,做一个对比。

很显然,上面代码的执行结果如下:

原始数据:userId: winwill2012password: 168

代码语言:javascript
复制
``` java
原始数据:
userId: winwill2012
password: 168
从文件恢复:
userId: winwill2012
password: 168

Process finished with exit code 0
```

然后我们再用transient关键字修饰一下password属性

代码语言:javascript
复制
``` java
package com.winwill.simple.test;
import java.io.Serializable;
/**
 * @author qifuguang
 * @date 16-6-23
 */
public class Account implements Serializable {
    private String userId;
    private transient String password;       // 就修改了这行代码
    public Account(String userId, String password) {
        this.userId = userId;
        this.password = password;
    }
    public String getPassword() {
        return password;
    }
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}
```

再次执行代码得到的结果如下

代码语言:javascript
复制
``` java
原始数据:
userId: winwill2012
password: 168
从文件恢复:
userId: winwill2012
password: null

Process finished with exit code 0
```

正文

通过上面的示例,大家也许已经知道transient的作用是什么了。没错,它的作用就是阻止它所修饰的属性被序列化。为什么会有这样的需求呢?比如:

我们要在网络上传输一些客户的资料,但是对于非常敏感的数据(比如薪资,各类密码之类的),我们担心在传输过程中这些敏感数据被窃取。

在上面这样的场景下,transient就能配上用场了, transient修饰的属性不能被序列化,但是这是有前提条件的。

我们知道在Java中要想让一个类能够实现序列化,可以通过如下两种方法:

  • 实现Serializable接口,这种情况下,对象的序列化和反序列化都是java自己的机制自动实现的,不需要人为实现;
  • 实现Externalizable接口,可以实现writeExternal()和readExternal()这两个方法,完成自己的序列化/反序列化操作;

transient修饰的属性不能被序列化这句话只在上面的第一种情况下成立,为什么呢?

因为 如果实现的是Externalizable接口,序列化和反序列化都是自己控制的,不受transient的约束。

结语

既然说到序列化,那就顺便提一下,如果一个变量是static的,那么无论是否有transient修饰词,都不能够别序列化,因为序列化是序列化一个对象,static变量根本不属于任何对象

参考链接:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/10/28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
  • 结语
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档