java中Trans方法在哪个类_在Java中如何使用transient

Java語言的transient不像class、synchronized和其他熟悉的關鍵字那樣眾所周知,因而它會出現在一些面試題中。這篇文章我將為大家講解transient。

transient的用途

Q:transient關鍵字能實現什么?

A:當對象被序列化時(寫入字節序列到目標文件)時,transient阻止實例中那些用此關鍵字聲明的變量持久化;當對象被反序列化時(從源文件讀取字節序列進行

transient使用介紹

Q:如何使用transient?

A:包含實例變量聲明中的transient修飾符。片段1提供了小的演示。

片段1:序列化和反序列化ClassLib對象

片段1中聲明ClassLib和TransDemo類。ClassLib是一個讀取Java類文件的庫,並且實現了java.io.Serializable接口,從而這些實例能被序列化和反序列化。TransDemo是一個用來序列化和反序列化ClassLib實例的應用類。

ClassLib聲明它的實例變量為transient,原因是它可以毫無意義的序列化一個輸入流(像上面講述的那樣)。事實上,如果此變量不是transient的話,當反序列化x.ser的內容時,則會拋出java.io.NotSerializableException,原因是InputStream沒有實現Serializable接口。

編譯片段1:javac TransDemo.java;帶一個參數TransDemo.class運行應用:java TransDemo TransDemo.class。你或許會看到類似下面的輸出:

以上輸出表明:當對象被重構時,沒有構造方法調用。此外,is假定默認為null,相比較,當ClassLib對象序列化時,majorVer和minorVer是有值的。

類中的成員變量和transient

Q:類中的成員變量中可以使用transient嗎?

A:問題答案請看片段2

片段2:序列化和反序列化Foo對象

片段2有點類似片段1。但不同的是,序列化和反序列化的是Foo對象,而不是ClassLib。此外,Foo包含一對變量,w和x,以及實例變量y和z。

編譯片段2(javac TransDemo.java)並運行應用(java TransDemo)。你可以看到如下輸出:

這個輸出告訴我們,實例變量y是被序列化的,z卻沒有,它被標記transient。但是,當Foo被序列化時,它並沒有告訴我們,是否變量w和x被序列化和反序列化,是否只是以普通類初始化方式初始。對於答案,我們需要查看x.ser的內容。

下面顯示x.ser十六進制:

AC ED 序列化協議標識

00 05 流版本號

73 表示這是一個新對象

72 表示這是一個新的類

00 03 表示類名長度(3)

46 6F 6F 表示類名(Foo)

FC 7A 5D 82 1D D2 9D 3F 表示類的串行版本標識符

02 表示該對象支持序列化

00 01 表示這個類的變量數量(1)

49 變量類型代碼 (0×49, 或I, 表示int)

00 01 表示變量名長度(1)

79 變量名稱(y)

78 表示該對象可選的數據塊末端

70 表示我們已經到達類層次結構的頂部

00 00 00 03 表示y的值(3)

顯而易見,只有實例變量y被序列化。因為z是transient,所以不能序列化。此外,即使它們標記transien,w和x不能被序列化,原因是它們類變量不能序列化。

原文鏈接:

javaworld

翻譯:

ImportNew.com

-

xbing

from: http://www.importnew.com/12611.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值