当我们对序列化进行控制时,可能某个特定子对象不想让java的序列化机制自动保存与恢复。如果子对象表示的信息是private属性,一经序列化处理,人们就可以通过读取文件或者拦截网络传输的方式来访问到它。
如果我们正在操作的是一个Serializable对象,那么所有的序列化操作都会自动进行。为了能够予以控制,可以用transient关键字逐个字段地关闭序列化。
在thinking in java书中的例子Login类保存了某个特定的登录回话信息。登录的合法性通过校验后,我们想把数据保存下来,但不保存密码,故password字段标志为transient。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class Logon implements Serializable{
private Date date = new Date();
private String username;
private transient String password;
public Logon(String name , String pwd){
this.username=name;
this.password=pwd;
}
public String toString(){
return "Logon info:\n username "+username+"\n date: "+date+"\n password: "+password;
}
public static void main(String[] args) throws Exception {
Logon a = new Logon("Hulk", "myLittlePony");
System.out.println("Logon a= "+a);
ObjectOutputStream o = new ObjectOutputStream(
new FileOutputStream("source/Logon.out"));
o.writeObject(a);
o.close();
TimeUnit.SECONDS.sleep(1);
//get a
ObjectInputStream in = new ObjectInputStream(
new FileInputStream("source/Logon.out"));
System.out.println("Recovering object at "+new Date());
a=(Logon)in.readObject();
System.out.println("Logon a = "+a);
}
}