transient

在阅读ArrayList类源码时,看到一个关键字 transient

平时基本没用过的,当时就是一脸懵逼啊,查阅了很多资料,才知道这个关键字和序列化有关系

首先看transient这个单词


transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。transient说明一个属性是临时的,不会被序列化

对于Java序列化,当对某些变量我们不想对它进行序列化的时候就可以将此变量设置为transient

打个比方,如果一个用户有一些敏感信息(如账号密码)不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

简单的例子:

public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private transient String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

public class TestOfTransient {
public static void main(String[] args) {
User user = new User();
user.setPassword("123456");
        user.setName("UserName");
        System.out.println("Name: " + user.getName());
        System.err.println("password: " + user.getPassword());
        try {
            ObjectOutputStream os = new ObjectOutputStream(
                    new FileOutputStream("C:/user.txt"));
            os.writeObject(user); // 将User对象写进文件
            os.flush();
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            ObjectInputStream is = new ObjectInputStream(new FileInputStream(
                    "C:/user.txt"));
            user = (User) is.readObject(); // 从流中读取User的数据
            is.close();
            System.out.println("Name: " + user.getName());
            System.err.println("password: " + user.getPassword());
 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
}
}

输出结果如下


密码字段为null,说明反序列化时根本没有从文件中获取到信息。

要点:

1.如果变量被transient修饰,它不再是对象持久化的一部分,该变量的内容在序列化后无法获取。

2.transient只能修饰变量,不能修饰类和方法


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值