transient简介
當一個對象實現了Serilizable接口,這個對象就可以被序列化,java的這種序列化模式為開發者提供了很多便利,我們可以不必關系具體序列化的過程,只要這個類實現了Serilizable接口,這個的所有屬性和方法都會自動序列化。
然而在實際開發過程中,我們常常會遇到這樣的問題,這個類的有些屬性需要序列化,而其他屬性不需要被序列化,誠然,你可以讓這個類來實現Externalizable接口,這個接口是Serilizable的子接口,但是你必須實現readExternal和writeExternal方法,你可以在這兩個方法中實現具體屬性的反序列化和序列化操作。然而這就意味著你必須在這兩個方法中手工編寫額外的代碼來進行具體屬性的序列化。java的transient關鍵字為我們提供了便利,你只需要實現Serilizable接口,將不需要序列化的屬性前添加關鍵字transient,序列化對象的時候,這個屬性就不會序列化到指定的目的地中。打個比方,如果一個用戶有一些敏感信息(如密碼,銀行卡號等),為了安全起見,不希望在網絡操作(主要涉及到序列化操作,本地序列化緩存也適用)中被傳輸,這些信息對應的變量就可以加上transient關鍵字。換句話說,這個字段的生命周期僅存于調用者的內存中而不會寫到磁盤里持久化。
1 public class TestTransient {
2
3 /**
4 * @param args
5 * @throws IOException
6 * @throws FileNotFoundException
7 * @throws ClassNotFoundException
8 */
9 public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
10 A a = new A(25,"張三");
11 System.out.println(a);
12 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c://mm.txt"));
13 oos.writeObject(a);
14 oos.close();
15 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c://mm.txt"));
16 a = (A)ois.readObject();
17 System.out.println(a);
18
19 }
20
21 }
22
23 class A implements Serializable{
24 int a;
25 transient String b;
26 public A(int a,String b){
27 this.a = a;
28 this.b = b;
29 }
30 public String toString(){
31 return "a = "+a+",b = "+b;
32 }
33 }
運行結果如下:
a = 25,b = 張三
a = 25,b = null
在上面的例子中,將屬性b前添加關鍵字transient,可以看到雖然序列化的對象a的屬性值為“張三”,但是當反序列化之后發現這個屬性為空,說明這個屬性沒有進行序列化。
原文:https://blog.csdn.net/zxl315/article/details/5359151
總結
以上是生活随笔為你收集整理的transient简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【自动化】火车头采集器
- 下一篇: Windows中的工作组和域