transient 是用于序列化的变量修饰符。
在序列化的时候,如果不想保存一个特殊的变量到文件中,那么应该在文件中使用transient修饰符。
当JVM碰到transient修饰符的时候,就会忽略原始值,而保存变量的默认值。
transient在安全性上扮演了重要的角色,我们可以不保存私密数据到文件中。 另外一个使用场景是,transient可以不序列化那些可以被重新计算出来的数据。 比如年龄。
// A sample class that uses transient keyword to
// skip their serialization.
class Test implements Serializable
{
// Making password transient for security
private transient String password;
// Making age transient as age is auto-
// computable from DOB and current date.
transient int age;
// serialize other fields
private String username, email;
Date dob;
// other code
}
transient static: 静态变量不是对象的状态,静态变量属于类,因此使用transient对静态变量没有效果。
transient final: final 变量会直接用初始值来序列化,所以transient对final变量也没有任何影响。 并且不会有编译错误。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class TransientTour implements Serializable {
private String normal = "I am normal fields";
private transient String sensitive = "I am transient fields";
private transient final String finalStr = "I am final transient fields";
private transient static String staticStr ="I am static transient fields";
public static void main(String args[]) throws IOException, ClassNotFoundException {
FileOutputStream fos = new FileOutputStream("transient.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
TransientTour out = new TransientTour();
oos.writeObject(out);
FileInputStream fis = new FileInputStream("transient.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
TransientTour in = (TransientTour)ois.readObject();
System.out.println(in.normal);
System.out.println(in.sensitive);
System.out.println(in.finalStr);
System.out.println(TransientTour.staticStr);
}
}