Java关键字——transient_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java关键字——transient

Java关键字——transient

 2012/1/3 9:14:43  snowolf  http://snowolf.iteye.com  我要评论(0)
  • 摘要:眼看就要2012了,这一年给自己树立的研究课题基本上因为工作的转型,最终都没能实现。开发经验开始消减,更没能赶上新技术。终于,我要恢复开发经验!找回曾经的我!最近被问到很多Java基础性的问题,突然发现自己长时间沉迷于框架整合的乐趣中,有关于底层这方面原来不曾深度研究,有必要恶补下了。“transient”——“瞬态”,先不说这个翻译是否恰当,这个变量关键字一直不曾使用,简单的说就是被瞬态定义的变量不可序列号。或者这么给他换个名字——“不可序列化状态”?打个比方,如果一个用户有一些敏感信息
  • 标签:Java 关键字
眼看就要2012了,这一年给自己树立的研究课题基本上因为工作的转型,最终都没能实现。开发经验开始消减,更没能赶上新技术。终于,我要恢复开发经验! 找回曾经的我!

最近被问到很多Java基础性的问题,突然发现自己长时间沉迷于框架整合的乐趣中,有关于底层这方面原来不曾深度研究,有必要恶补下了。
“transient”——“瞬态”,先不说这个翻译是否恰当,这个变量关键字一直不曾使用,简单的说就是被瞬态定义的变量不可序列号。或者这么给他换个名字——“不可序列化状态”?
打个比方,如果一个用户有一些敏感信息(譬如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输。这些信息对应的变量就可以被定义为transient类型。换句话说,这个字段的生命周期仅存于调用者的内存中。
定义People
public class People implements Serializable {
	private static final long serialVersionUID = 8294180014912103005L;

	/**
	 * 用户名
	 */
	private String username;
	/**
	 * 密码
	 */
	private transient String password;
}


密码字段为transient,这时候如果对该对象进行序列化,这个密码字段是不会被保存的。
为了代码简洁,未将流操作至于try-catch中,仅为演示,勿仿!
public static void main(String[] args) throws Exception {

		People p = new People();
		p.setUsername("snowolf");
		p.setPassword("123456");

		System.err.println("------操作前------");
		System.err.println("username: " + p.getUsername());
		System.err.println("password: " + p.getPassword());

		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
				"people.txt"));
		oos.writeObject(p);
		oos.flush();
		oos.close();

		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
				"people.txt"));
		p = (People) ois.readObject();

		ois.close();

		System.err.println("------操作后------");
		System.err.println("username: " + p.getUsername());
		System.err.println("password: " + p.getPassword());

	}

执行操作:
引用------操作前------
username: snowolf
password: 123456
------操作后------
username: snowolf
password: null
密码字段为null,反序列化时根本没有从文件中获取到信息。
这个变量类型,理解起来都不费事,但就是适用场景,我一直纠结。
暂时整理如下,欢迎拍砖补充!
适用场景:
1.不打算序列化某字段的值,节省空间
2.传递序列化流的时候,不传递该值等


如上信息似乎跟JNI有关,欢迎拍砖!

发表评论
用户名: 匿名