之前在看ArrayList的源码的时候就遇到了这个关键字,不知道它是什么意思,但是那个时候太忙了就跳过了,最近在看LinkedList的时候又遇到了这个关键字,突然想起了,就决心把它整理一下,说实话java里的基础知识还是很多啊,还需要再接再厉的学习,不可一日放松。下面就说下这个神秘的关键字transient ,它到底是干嘛的(以下是我在网上搜索整理的)
1、transient 的作用:
我们先来看看官方是怎么说的,“Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的”
上面的官方的话你可以这样来理解,就容易多了
我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。
然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。transient——不可序列化状态。
2、实例
下面通过一个简单的例子来 具体说明:
/**
* 主要测试transient关键字
* @author zhaocd
*
*/
public class TransientExam implements Serializable{
private String username;
private transient String password;//在密码这个属性前面加上transient关键字
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;
}
//在main方法中测试
public static void main(String[] args) {
TransientExam ts = new TransientExam();
ts.setUsername("李白");
ts.setPassword("123456");
try {
//将这个对象写到一个文本文件里
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("E:\\transient.txt"));
os.writeObject(ts);
os.flush();
os.close();
//因为是序列化写进去的,所以我们打开文件看的时候看到的是类似乱码的形式,在这把它再读出来
ObjectInputStream is = new ObjectInputStream(new FileInputStream("E:\\transient.txt"));
ts = (TransientExam)is.readObject();
is.close();
System.out.println(ts.getUsername());
System.out.println(ts.getPassword());
} catch (Exception e) {
e.printStackTrace();
}
}
}
下面是运行的结果:
通过这个结果我们可以看到,密码读取出来是null,这说明密码这个属性并没有被写到文件中,也印证了上面说的transient的作用。
学习之事在于持之以恒,希望以后能写出更高质量的博客。