日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java transient_【转】Java中的关键字 transient

發布時間:2025/3/21 java 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java transient_【转】Java中的关键字 transient 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閱讀目錄

先解釋下Java中的對象序列化

在討論transient之前,有必要先搞清楚Java中序列化的含義;

Java中對象的序列化指的是將對象轉換成以字節序列的形式來表示,這些字節序列包含了對象的數據和信息,一個序列化后的對象可以被寫到數據庫或文件中,也可用于網絡傳輸,一般當我們使用緩存cache(內存空間不夠有可能會本地存儲到硬盤)或遠程調用rpc(網絡傳輸)的時候,經常需要讓我們的實體類實現Serializable接口,目的就是為了讓其可序列化。

當然,序列化后的最終目的是為了反序列化,恢復成原先的Java對象,要不然序列化后干嘛呢,所以序列化后的字節序列都是可以恢復成Java對象的,這個過程就是反序列化。

關于transient關鍵字

Java中transient關鍵字的作用,簡單地說,就是讓某些被修飾的成員屬性變量不被序列化,這一看好像很好理解,就是不被序列化,那么什么情況下,一個對象的某些字段不需要被序列化呢?如果有如下情況,可以考慮使用關鍵字transient修飾:

1、類中的字段值可以根據其它字段推導出來,如一個長方形類有三個屬性:長度、寬度、面積(示例而已,一般不會這樣設計),那么在序列化的時候,面積這個屬性就沒必要被序列化了;

2、其它,看具體業務需求吧,哪些字段不想被序列化;

PS,記得之前看HashMap源碼的時候,發現有個字段是用transient修飾的,我覺得還是有道理的,確實沒必要對這個modCount字段進行序列化,因為沒有意義,modCount主要用于判斷HashMap是否被修改(像put、remove操作的時候,modCount都會自增),對于這種變量,一開始可以為任何值,0當然也是可以(new出來、反序列化出來、或者克隆clone出來的時候都是為0的),沒必要持久化其值。

/*** The number of times this HashMap has been structurally modified

* Structural modifications are those that change the number of mappings in

* the HashMap or otherwise modify its internal structure (e.g.,

* rehash). This field is used to make iterators on Collection-views of

* the HashMap fail-fast. (See ConcurrentModificationException).*/

transient int modCount;

最后,為什么要不被序列化呢,主要是為了節省存儲空間,其它的感覺沒啥好處,可能還有壞處(有些字段可能需要重新計算,初始化什么的),總的來說,利大于弊。

舉個例子

僅僅是示例,具體使用請根據實際情況:

packagetmp;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.Serializable;class Rectangle implementsSerializable{/****/

private static final long serialVersionUID = 1710022455003682613L;privateInteger width;privateInteger height;private transientInteger area;publicRectangle (Integer width, Integer height){this.width =width;this.height =height;this.area = width *height;

}public voidsetArea(){this.area = this.width * this.height;

}

@OverridepublicString toString(){

StringBuffer sb= new StringBuffer(40);

sb.append("width : ");

sb.append(this.width);

sb.append("\nheight : ");

sb.append(this.height);

sb.append("\narea : ");

sb.append(this.area);returnsb.toString();

}

}public classTransientExample{public static void main(String args[]) throwsException {

Rectangle rectangle= new Rectangle(3,4);

System.out.println("1.原始對象\n"+rectangle);

ObjectOutputStream o= new ObjectOutputStream(new FileOutputStream("rectangle"));//往流寫入對象

o.writeObject(rectangle);

o.close();//從流讀取對象

ObjectInputStream in = new ObjectInputStream(new FileInputStream("rectangle"));

Rectangle rectangle1=(Rectangle)in.readObject();

System.out.println("2.反序列化后的對象\n"+rectangle1);

rectangle1.setArea();

System.out.println("3.恢復成原始對象\n"+rectangle1);

in.close();

}

}

結果打印(達到目的,節省存儲空間,成功恢復成原始對象):

1.原始對象

width : 3

height : 4

area : 12

2.反序列化后的對象

width : 3

height : 4

area : null

3.恢復成原始對象

width : 3

height : 4

area : 12

轉載:

總結

以上是生活随笔為你收集整理的java transient_【转】Java中的关键字 transient的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。