被transient关键字修饰的属性,在序列化对象的时候,不会序列化这个属性。
引入就是说,一个对象,某个有值得属性如果被transient修饰,那么这个对象在经过序列化和反序列化以后,该属性之前的值会消失掉,变成属性类型的默认值。
因为安全,一些对象属性不想被序列化到硬件中,就可以用transient修饰,使得该属性的生命周期仅仅存在内存中。
java的序列化有两种方式:
第一重就是实现Serializable接口,第二种就是实现Exteranlizable接口,需要重写writeExternal和readExternal方法,它的效率比Serializable高一些,并且可以决定哪些属性需要序列化(即使是transient修饰的),但是对大量对象,或者重复对象,则效率低。
如果是通过实现Exteranlizable接口来做序列话的时候,那么transient关键字就会失效,一个属性就算是被transient修饰那么在序列化和反序列化的时候也会被参入其中。
那么静态变量呢?被transient修饰的话,是否会参与序列化?
答案是不会,因为静态变量存放的位置是在方法区中,而序列化是序列化到硬盘上的,在取这个属性的时候,是从方发区去取的,而不是通过硬盘数据反序列化来获得,所以被transient修饰的静态变量不会参与序列化与反序列化。