关于java的关键字 transient
我們都知道一個(gè)對(duì)象只要實(shí)現(xiàn)了Serilizable接口,這個(gè)對(duì)象就可以被序列化,Java的這種序列化模式為開發(fā)者提供了很多便利,我們可以不必關(guān)系具體序列化的過(guò)程,只要這個(gè)類實(shí)現(xiàn)了Serilizable接口,這個(gè)的所有屬性和方法都會(huì)自動(dòng)序列化。
?
然而在實(shí)際開發(fā)過(guò)程中,我們常常會(huì)遇到這樣的問(wèn)題,這個(gè)類的有些屬性需要序列化,而其他屬性不需要被序列化,誠(chéng)然,你可以讓這個(gè)類來(lái)實(shí)現(xiàn)Externalizable接口,這個(gè)接口是Serilizable的子接口,但是你必須實(shí)現(xiàn)readExternal和writeExternal方法,你可以在這兩個(gè)方法中實(shí)現(xiàn)具體屬性的反序列化和序列化操作。然而這就意味著你必須在這兩個(gè)方法中手工編寫額外的代碼來(lái)進(jìn)行具體屬性的序列化。java的transient關(guān)鍵字為我們提供了便利,你只需要實(shí)現(xiàn)Serilizable接口,將不需要序列化的屬性前添加關(guān)鍵字transient,序列化對(duì)象的時(shí)候,這個(gè)屬性就不會(huì)序列化到指定的目的地中。
?
?
package com.zslin.list.demo; import java.io.Serializable;/** * * @author WQ<br> * @version 創(chuàng)建時(shí)間: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 創(chuàng)建時(shí)間: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);} }?
運(yùn)行結(jié)果:
?
?
?在上面的例子中,我將屬性b前添加關(guān)鍵字transient,我們看到雖然我們序列化的對(duì)象a的屬性值為“張三”,但是當(dāng)我們反序列化之后發(fā)現(xiàn)這個(gè)屬性為空,說(shuō)明這個(gè)屬性沒有進(jìn)行序列化。
?
transient使用小結(jié)?
1)一旦變量被transient修飾,變量將不再是對(duì)象持久化的一部分,該變量?jī)?nèi)容在序列化后無(wú)法獲得訪問(wèn)。
2)transient關(guān)鍵字只能修飾變量,而不能修飾方法和類。注意,本地變量是不能被transient關(guān)鍵字修飾的。變量如果是用戶自定義類變量,則該類需要實(shí)現(xiàn)Serializable接口。
3)被transient關(guān)鍵字修飾的變量不再能被序列化,一個(gè)靜態(tài)變量不管是否被transient修飾,均不能被序列化。
?
我們也可以,通過(guò)ArrayList 源碼中的 ?elementData ?屬性,進(jìn)一步學(xué)習(xí)transient這一屬性。
具體可以參照我的上一篇博客。
以上。
?
轉(zhuǎn)載于:https://www.cnblogs.com/mr-wuxiansheng/p/7043751.html
總結(jié)
以上是生活随笔為你收集整理的关于java的关键字 transient的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: centos 安装 acrobat Re
- 下一篇: 浅谈块级元素和行级元素的相对定位和绝对定