1、transient關鍵字隻能修飾變量,而不能修飾方法和類。注意,本地變量是不能被transient關鍵字修飾的。
2、被transient關鍵字修飾的變量不再能被序列化,一個靜态變量不管是否被transient修飾,均不能被序列化。
3、一旦變量被transient修飾,變量将不再是對象持久化的一部分,該變量内容在序列化後無法獲得通路。也可以認為在将持久化的對象反序列化後,被transient修飾的變量将按照普通類成員變量一樣被初始化。
<a></a>
如下面的例子
package com.kkoolerter;
import java.io.file;
import java.io.fileinputstream;
import java.io.fileoutputstream;
import java.io.objectinputstream;
import java.io.objectoutputstream;
import java.io.serializable;
import java.util.date;
public class main implements serializable {
private static final long serialversionuid = -5836283489677344417l;
private transient int classvalue = 10;
private transient date date = new date();
private transient static int staticvalue = 10;
public static void main(string[] args) throws exception {
main m = new main();
m.classvalue = 11;
main.staticvalue = 11;
objectoutputstream out = new objectoutputstream(new fileoutputstream(
new file(“0xjh000”)));
out.writeobject(m);
out.close();
objectinputstream in = new objectinputstream(new fileinputstream(
main m1 = (main) in.readobject();
in.close();
system.out.println(m1.classvalue);
system.out.println((m1.date == null ? “date is null”
: “date is not null”));
}
}
程式将輸出:
date is null
這就說明了一旦變量被transient修飾,變量将不再是對象持久化的一部分,該變量内容在序列化後無法獲得通路。
思考一下下面的例子:
import java.io.externalizable;
import java.io.ioexception;
import java.io.objectinput;
import java.io.objectoutput;
public class externalizabletest implements externalizable {
private transient string content = “哈哈~我将會被序列化,不管我是是否被transient關鍵字修飾”;
@override
public void writeexternal(objectoutput out) throws ioexception {
out.writeobject(content);
public void readexternal(objectinput in) throws ioexception,
classnotfoundexception {
content = (string) in.readobject();
externalizabletest et = new externalizabletest();
objectoutput out = new objectoutputstream(new fileoutputstream(
new file(“ext0000”)));
out.writeobject(et);
objectinput in = new objectinputstream(new fileinputstream(new file(
“ext0000”)));
externalizabletest et1 = (externalizabletest) in.readobject();
system.out.println(et1.content);
程式運作後将輸出如下結果:
哈哈~我将會被序列化,不管我是是否被transient關鍵字修飾
這是為什麼呢,不是說類的變量被transient關鍵字修飾以後将不能序列化了嗎?
我
們知道在java中,對象的序列化可以通過實作兩種接口來實作,若操作的是一個serializable對象,則所有的序列化将會自動進行,若操作的是
一個externalizable對象,則沒有任何東西可以自動序列化,需要在writeexternal方法中進行手工指定所要序列化的變量,這與是否
被transient修飾無關。是以第二個例子輸出的是變量content初始化的内容,而不是null。
本文出自 “有思想的代碼” 部落格,請務必保留此出處http://wujuxiang.blog.51cto.com/2250829/430211