Java中transient关键字的应用

  今天跟JDK源码的时候发现transient ,感觉从来没见过,于是用google查了一下.

  Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。

 下面我们查创建一个LoginFile的类:

public class LoginFile implements Serializable{
	private static final long serialVersionUID = 1L;
	private String name = null;
	private transient String pwd = null;
	
	public LoginFile() {
		name = "shirdey";
		pwd = "654321";
	}
	public String toString(){
		return "ClassName:LoginFile"
				+"\nname = "+name
				+"\npwd = "+pwd;
	}
}

然后初始化LoginFile对象,将该对象写到硬盘上:

LoginFile loginFile = new LoginFile();
	System.out.println(loginFile.toString());
	try {
	   ObjectOutputStream outputStream = new ObjectOutputStream (new FileOutputStream("login.out"));
	outputStream.writeObject(loginFile);
	   outputStream.close();
	} catch (FileNotFoundException e) {
	   e.printStackTrace();
	}

此时打开login.out文件看不到pwd字段没,然后我们通过读取login.out测试一下:

try {
	ObjectInputStream inputStream  = new ObjectInputStream(new FileInputStream("login.out"));
	LoginFile loginFile = (LoginFile) inputStream.readObject();
	System.out.println(loginFile.toString());
	} catch (Exception e) {
	}

output:

ClassName:LoginFile
name = shirdey
pwd = null

    很明显,被transient修改的pwd字段并没有被保存在硬盘

    当串行化某个对象时,如果该对象的某个变量是transient,那么这个变量不会被串行化进去。也就是说,假设某个类的成员变量是transient,那么当通过ObjectOutputStream把这个类的某个实例保存到磁盘上时,实际上transient变量的值是不会保存的。因为当从磁盘中读出这个对象的时候,对象的该变量会没有被赋值。
    另外这篇文章还提到,当从磁盘中读出某个类的实例时,实际上并不会执行这个类的构造函数,而是读取这个类的实例的状态,并且把这个状态付给这个类的对象。这点我以前似乎不知道。

参考文献:http://www.devx.com/tips/Tip/13726



 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值