我們都知道一個對象只要實現了Serilizable接口,這個對象就可以被序列化,Java的這種序列化模式為開發者提供了很多便利,我們可以不必關系具體序列化的過程,只要這個類實現了Serilizable接口,這個的所有屬性和方法都會自動序列化。
?
然而在實際開發過程中,我們常常會遇到這樣的問題,這個類的有些屬性需要序列化,而其他屬性不需要被序列化,誠然,你可以讓這個類來實現Externalizable接口,這個接口是Serilizable的子接口,但是你必須實現readExternal和writeExternal方法,你可以在這兩個方法中實現具體屬性的反序列化和序列化操作。然而這就意味著你必須在這兩個方法中手工編寫額外的代碼來進行具體屬性的序列化。java的transient關鍵字為我們提供了便利,你只需要實現Serilizable接口,將不需要序列化的屬性前添加關鍵字transient,序列化對象的時候,這個屬性就不會序列化到指定的目的地中。
?
?
package com.zslin.list.demo; import java.io.Serializable;/** * * @author WQ<br> * @version 創建時間:2017年6月18日 上午10:33:15<br> */ public 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;} }
?
?
package com.zslin.list.demo;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream;/*** * @author WQ<br>* @version 創建時間:2017年6月18日 上午10:34:09<br>*/ public class TestTransient {public static void main(String[] args) throws IOException,ClassNotFoundException {A a = new A(25, "張三");System.out.println(a);ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D://mm.txt"));oos.writeObject(a);oos.close();ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D://mm.txt"));a = (A) ois.readObject();System.out.println(a);} }
?
運行結果:
?
?
?在上面的例子中,我將屬性b前添加關鍵字transient,我們看到雖然我們序列化的對象a的屬性值為“張三”,但是當我們反序列化之后發現這個屬性為空,說明這個屬性沒有進行序列化。
?
transient使用小結?
1)一旦變量被transient修飾,變量將不再是對象持久化的一部分,該變量內容在序列化后無法獲得訪問。
2)transient關鍵字只能修飾變量,而不能修飾方法和類。注意,本地變量是不能被transient關鍵字修飾的。變量如果是用戶自定義類變量,則該類需要實現Serializable接口。
3)被transient關鍵字修飾的變量不再能被序列化,一個靜態變量不管是否被transient修飾,均不能被序列化。
?
我們也可以,通過ArrayList 源碼中的 ?elementData ?屬性,進一步學習transient這一屬性。
具體可以參照我的上一篇博客。
以上。
?