transient关键字解析

一、序列化与反序列化的含义
Java中的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让我们的实体类实现Serializable接口,目的就是让其可序列化(交互双方的一个公共标准)。
当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象,要不然序列化后干嘛呢,所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。

二、关于transient关键字
transient关键字只能修饰变量,不能修饰方法和类。注意,局部变量是不能被transient关键字修饰的。

Java中transient关键字的作用,简单地说,就是让某些被修饰的成员属性变量不被序列化(一个静态变量不管是否被transient修饰,均不能被序列化,因为是类级别的)。举例:
1.类中的字段值可以根据其它字段推导出来,如一个长方形类有三个属性:长度、宽度、面积,则在序列化的时候,面积这个属性就没必要序列化了;
2.其它,看具体业务需求,哪些字段不想被序列化;
3.Java源码,比如HashMap中的modCount字段,主要用于判断HashMap是否被修改(像put、remove操作的时候,modCount都会自增),对于这种变量,一开始可以为任何值,0当然也可以,没必要持久化其值(transient int modCount;)。

一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。也可以认为在将持久化的对象反序列化后,被transient修饰的变量将按照普通类成员变量一样被初始化。
最后,为什么要不被序列化呢,主要是为了节省存储空间。


猜你喜欢

转载自www.cnblogs.com/yuanfei1110111/p/10361255.html