java语言的关键字,变量修饰符。如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。
比如,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
示例代码:
import java.io.*;
class TransientTest {
public static void main(String[] args) {
Person person = new Person("hehe", "123");
System.out.println(person.username);
System.out.println(person.password);
try {
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("text.txt"));
os.writeObject(person);
os.flush();
os.close();
} catch (Exception e) {
}
try {
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("text.txt"));
Person person1 = (Person) inputStream.readObject();
System.out.println(person1.username);
System.out.println(person1.password);
} catch (Exception e) {
}
}
}
class Person implements Serializable {
Person(String username, String password) {
this.password = password;
this.username = username;
}
public String username;
public transient String password;
}
最后输出结果为
hehe
123
hehe
null
总结:
1)变量被transient修饰,则该变量内容不会被序列化保存。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)静态成员是不能被序列化的,因为静态成员是随着类的加载而加载的,与类共存亡,并且静态成员的默认初始值都是0并且静态成员是类相关的。