transient关键字作用

java这么久,发现竟然不知道transient关键字的作用

总的来说:transient修饰的关键字不会被序列化

一、序列化和反序列化

名词解释

  1. 序列化:把java对象写入到I/O流 ,即把java对象转换为字节序列,并将字节序列保存在磁盘上,或通过网络传输
  2. 反序列化:从I/O流中恢复对象,即把得到的字节序列恢复成java对象

序列化的方法

实现序列化有两种方法:实现Serializable接口或Externalizable接口

二、transient的作用

  1. 一旦变量被transient修饰,变量不再是对象持久化的一部分,该变量在反序列化后也无法获得
  2. transient关键字只能修饰变量,不能修饰方法和类
  3. 一个静态变量不管是否被transient修饰,均不能被序列化

举个例子,User类序列化,password使用transient修饰,代码如下:

public class TransientTest {
    public static void main(String[] args) {
        User user = new User();
        user.setUsername("zhangsan");
        user.setPassword("123");
        System.out.println("---------序列化前读取---------");
        System.out.println(user.toString());
        try {
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("C:/a.txt"));
            out.writeObject(user);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            ObjectInputStream in = new ObjectInputStream(new FileInputStream("C:/a.txt"));
            user = (User) in.readObject();
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("---------序列化后读取---------");
        System.out.println(user.toString());
    }

}

class User implements Serializable {
    private String username;
    private transient String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

打印结果:

---------序列化前读取---------
User{username='zhangsan', password='123'}
---------序列化后读取---------
User{username='zhangsan', password='null'}

可以看到,字段password在反序列化过程中,没有被读取到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值