transient

1、 transient的释义

在百度百科里对transient的解释是:

java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。

作用:

Javaserialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。

但是在我看到这么多专有名词的时候脑袋还是有点晕的,后来研究了一下,是这么个意思:

在缓存机制中、IO(读写文件)、网络传输的过程中,我们对一些文件、字符、图像的传输是没有办法整体传输的,那么我们这个时候会将这些对象转换成字节进行数据的传输,这个过程就是序列化的过程。但是,打个比方我们在进行信息传递的过程中有一些敏感信息例如密码是不能够进行传输的,这时候我们就需要在密码属性前面添加transient关键字,使密码属性跳出对象序列化的范围中,所以在一定程度上保证了该信息的安全。

ps:序列化百度解释:

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

2、 transient的实际使用

a、 序列化的基本展示实现Serializable接口

二话不说直接上例子吧:

 

输出结果为:

 

transient.txt文件中内容为:

 

从输出结果来看我们很清楚的可以看到,添加了transient关键字后pwd参数无法保存到txt文件中。

Ps

如果Test1类中的参数添加了static关键字修饰,那么在读取写入的文件之前修改了相关的参数,那么在反序列化过程中该参数不会被改变,会保留你修改后的结果,因为static参数是随着类加载的过程中一起保存在java虚拟机内存中的,而在反序列化过程中并不会修改这些静态变量。

b、 序列化的另一种实现Externalizable接口

二话再次不多说直接看代码吧

 

输出结果为:

 

输出的文件为:

 

结果很明显实现Externalizable接口实现了两个函数分别是writeExternalreadExternal

这样子在序列化的过程中只序列化了nameage两个参数。

Ps

1、 如果pwd存在默认值得话输出结果就不会为null,会得到重新初始化,值为初始参数

2、 ReadExternal函数接口调用的过程中会调用相应参数的get方法,必须要添加进去

3、 transient的意外

是否只要添加了transient关键字就一定会在序列化过程中不被序列化?

答案是否定的,请看如下代码。

 

输出结果为:

 

输出文件为:

 

看到如图代码和输出结果,我们可以清楚的看到哪怕pwd参数添加了transient关键字,但是因为实现的是Externalizable接口,所以在重写的writeExternalreadExternal函数中只要添加了pwd参数的写入和读取,transient关键字就相当于是失效的。

 

希望对大家有所帮助,代码依然是图片,手敲有益身心健康。

参考博客:

https://www.cnblogs.com/lanxuezaipiao/p/3369962.html