java transient_【转】Java中的关键字 transient
閱讀目錄
先解釋下Java中的對(duì)象序列化
在討論transient之前,有必要先搞清楚Java中序列化的含義;
Java中對(duì)象的序列化指的是將對(duì)象轉(zhuǎn)換成以字節(jié)序列的形式來(lái)表示,這些字節(jié)序列包含了對(duì)象的數(shù)據(jù)和信息,一個(gè)序列化后的對(duì)象可以被寫到數(shù)據(jù)庫(kù)或文件中,也可用于網(wǎng)絡(luò)傳輸,一般當(dāng)我們使用緩存cache(內(nèi)存空間不夠有可能會(huì)本地存儲(chǔ)到硬盤)或遠(yuǎn)程調(diào)用rpc(網(wǎng)絡(luò)傳輸)的時(shí)候,經(jīng)常需要讓我們的實(shí)體類實(shí)現(xiàn)Serializable接口,目的就是為了讓其可序列化。
當(dāng)然,序列化后的最終目的是為了反序列化,恢復(fù)成原先的Java對(duì)象,要不然序列化后干嘛呢,所以序列化后的字節(jié)序列都是可以恢復(fù)成Java對(duì)象的,這個(gè)過(guò)程就是反序列化。
關(guān)于transient關(guān)鍵字
Java中transient關(guān)鍵字的作用,簡(jiǎn)單地說(shuō),就是讓某些被修飾的成員屬性變量不被序列化,這一看好像很好理解,就是不被序列化,那么什么情況下,一個(gè)對(duì)象的某些字段不需要被序列化呢?如果有如下情況,可以考慮使用關(guān)鍵字transient修飾:
1、類中的字段值可以根據(jù)其它字段推導(dǎo)出來(lái),如一個(gè)長(zhǎng)方形類有三個(gè)屬性:長(zhǎng)度、寬度、面積(示例而已,一般不會(huì)這樣設(shè)計(jì)),那么在序列化的時(shí)候,面積這個(gè)屬性就沒(méi)必要被序列化了;
2、其它,看具體業(yè)務(wù)需求吧,哪些字段不想被序列化;
PS,記得之前看HashMap源碼的時(shí)候,發(fā)現(xiàn)有個(gè)字段是用transient修飾的,我覺(jué)得還是有道理的,確實(shí)沒(méi)必要對(duì)這個(gè)modCount字段進(jìn)行序列化,因?yàn)闆](méi)有意義,modCount主要用于判斷HashMap是否被修改(像put、remove操作的時(shí)候,modCount都會(huì)自增),對(duì)于這種變量,一開(kāi)始可以為任何值,0當(dāng)然也是可以(new出來(lái)、反序列化出來(lái)、或者克隆clone出來(lái)的時(shí)候都是為0的),沒(méi)必要持久化其值。
/*** 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;
最后,為什么要不被序列化呢,主要是為了節(jié)省存儲(chǔ)空間,其它的感覺(jué)沒(méi)啥好處,可能還有壞處(有些字段可能需要重新計(jì)算,初始化什么的),總的來(lái)說(shuō),利大于弊。
舉個(gè)例子
僅僅是示例,具體使用請(qǐng)根據(jù)實(shí)際情況:
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.原始對(duì)象\n"+rectangle);
ObjectOutputStream o= new ObjectOutputStream(new FileOutputStream("rectangle"));//往流寫入對(duì)象
o.writeObject(rectangle);
o.close();//從流讀取對(duì)象
ObjectInputStream in = new ObjectInputStream(new FileInputStream("rectangle"));
Rectangle rectangle1=(Rectangle)in.readObject();
System.out.println("2.反序列化后的對(duì)象\n"+rectangle1);
rectangle1.setArea();
System.out.println("3.恢復(fù)成原始對(duì)象\n"+rectangle1);
in.close();
}
}
結(jié)果打印(達(dá)到目的,節(jié)省存儲(chǔ)空間,成功恢復(fù)成原始對(duì)象):
1.原始對(duì)象
width : 3
height : 4
area : 12
2.反序列化后的對(duì)象
width : 3
height : 4
area : null
3.恢復(fù)成原始對(duì)象
width : 3
height : 4
area : 12
轉(zhuǎn)載:
總結(jié)
以上是生活随笔為你收集整理的java transient_【转】Java中的关键字 transient的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 1.7升级到1.8_CentO
- 下一篇: java xlsx读写_Java读写Ex