Java关键字transient学习
关键字transient的用途
首先我们从官方了解到该关键字的解释:
Variables may be marked transient to indicate that they are not part of the persistent state of an object.
变量被transient标记表明不是一个对象持久化的一部分。
我们知道,一个对象如果实现了Serilizable接口,就能被序列化,对象的所有属性和方法都会被序列化,Java的这种序列化模式为我们提供了很多的便利,我们可以不用关心其内部的实现原理。
在实际的开发过程中,我们希望对象的有些属性可以不用序列化,比如:用户密码、身份证号码等敏感信息,从安全角度思考,不希望该类信息在网络传输中(主要涉及到序列化操作,本地序列化缓存也适用)进行,可以理解为该类信息只存在于调用者的内存中,而不会持久化存储在磁盘中,能节省空间一定的存储空间。
用途有以下几种情况:
1)当对象的某些敏感属性不需要被序列化时。
2)当对象的某些属性可以通过其他属性推导出时。
从HashMap源码中了解到有个字段(modCount)不需要被序列化,该字段是用来记录HashMap被修改次数,在(remove、clear、put)中都会做自增,该属性刚开始可以为任何值,(new、反序列化、克隆出来都为0),所以没必要序列化。
/**
* The number of times this HashMap has been structurally modified
* Structural modifications are those that change the number of mappings in
* the HashMap or otherwise modify its internal structure (e.g.,
* rehash). This field is used to make iterators on Collection-views of
* the HashMap fail-fast. (See ConcurrentModificationException).
*/
transient int modCount;
关键字transient的使用方法
注意:该关键字只能作用于类的属性,不能用于方法、类等。
在不需要进行序列化的属性之前加上transient关键字即可。