今天在看struts1源碼的時候,發現在ActionForm中首先聲明瞭兩個transient類型的protected變量。之前沒有接觸過該transient類型,所以就查了查。
transient是java語言的關鍵字,變量修飾符,如果用它聲明一個實例變量,當對象存儲時,它的值不需要維持。
在java中一個對象只要實現了Serilizable接口,這個對象就可以被序列化,java的這種序列化模式爲開發者提供了很多便利,我們可以不必關係具體序列化的過程,只要這個類實現了Serilizable接口,這個的所有屬性和方法都會自動序列化。
然而在實際開發過程中,我們常常會遇到這樣的問題,這個類的有些屬性需要序列化,而其他屬性不需要被序列化,誠然,你可以讓這個類來實現Externalizable接口,這個接口是Serilizable的子接口,但是你必須實現readExternal和writeExternal方法,你可以在這兩個方法中實現具體屬性的反序列化和序列化操作。然而這就意味着你必須在這兩個方法中手工編寫額外的代碼來進行具體屬性的序列化。這時transient就派上用場了,你只需要實現Serilizable接口,將不需要序列化的屬性前添加關鍵字transient,序列化對象的時候,這個屬性就不會序列化到指定的目的地中。而在struts源碼中,ActionForm也確實是implement了Serilizable接口。
下面是個小例子,從運行結果上就可以看明白了
public class TestTransient {
public static void main(String[] args) throws FileNotFoundException, IOException,
ClassNotFoundException {
A a = new A(25,"姓名");
System.out.println(a);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c://transient.txt"));
oos.writeObject(a);
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c://transient.txt"));
a = (A)ois.readObject();
System.out.println(a);
}
}
class A implements Serializable{
int a;
transient String b;
public A(int a,String b){
this.a = a;
this.b = b;
}
public String toString(){
return "a = "+a+",b = "+b;
}
}
運行結果如下:
a = 25,b = 姓名
a = 25,b = null