默认情况下当执行了对象序列化的时候,会将类中的全部属性的内容进行全部的序列化,但是很多情况下,有一些属性并不需要序列化的处理,所以只需要在属性上定义transient关键字就可以了。
例如:
private transient String name;
在这个时候在进行序列化处理的时候,name属性的内容是不会被保存下来,换言之,读取到的name属性的内容就是' null '.
import java.io.*;
@SuppressWarnings("serial")
class Person implements Serializable{ // Serializable接口中没有任何方法,其作用是描述类的能力,和克隆接口一样
// 此时 Person类可以被序列化
// private static final long serialVersionUID = 1L; // 为了防止反序列化,一般会加上一个序列号,但是意义不大,因为可以选择@SuppressWarnings("serial")压制
private transient String name;
int age;
public Person(String name,int age){
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class MAIN {
private static final File SAVE_FILE = new File("D:" + File.separator + "CDLM.Person");
public static void main(String[] args) throws Exception{
saveObject(new Person("张三",18));
System.out.println(loadObject());
}
public static void saveObject(Object obj) throws Exception{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
oos.writeObject(obj); // 序列化
oos.close();
}
public static Object loadObject() throws Exception{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(SAVE_FILE));
Object obj = ois.readObject(); // 反序列化
ois.close();
return obj;
}
}
输出结果
明显可以发现,name属性并没输出出来,所以transient起到了作用。
使用情景:
如果类之中有一些是需要计算保存的属性内容往往是不需要被序列化的,这个时候就不使用,但是在开发之中大部分需要被序列化的类往往都是简单Java类,所以这一个关键字的出现频率并不高。