OK,先别急,在了解 Transient 之前我们先要了解一下什么是序列化,这是个前提。
什么是序列化:
Java 中的对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了该对象的数据与信息,这样方面我们将该对象写入数据库或文件中等等,也可以在网络间进行传输。
我们最经常使用的就是让我们的实体类实现 Serializable 接口,其目的就是为了让其可以序列化。既然可以序列化,当然也可以别反序列化,将其恢复成原先的 Java 对象。
了解完序列化之后,咱们就可以来看 Transient 关键字了
Transient关键字:
Transient 的意义就是阻止序列化(不进行序列化)。
Transient 只能修饰自定义的成员变量,不能修饰本地变量、修饰类、方法等等。一旦被 Transient 所修饰的成员变量是不会被序列化,因为该成员变量已经不再是持久化的一部分了,所以该成员变量在序列化后无法获得。
注意:在使用 Transient 时,需要让该类实现 Serializable 接口
怎么使用 Transient:
我们举个例子,小明的信息有:姓名、年龄、地址。这些信息在网络上传输的时候地址就属于个人敏感信息,我们希望安全,保密。我们就不需要序列化地址。(单纯举例而已)
import java.io.Serializable;
public class MrMing implements Serializable { // 实现 Serializable 接口
private String name;
private Integer age;
private transient String address; // 使用 transient 关键字修饰成员变量
... // 省略 get set 方法
}
import java.io.*;
public class TransientDemo {
public static void main(String[] args) {
try {
// 创建一个小明,并设置相应属性
MrMing mrMing = new MrMing();
mrMing.setName("小明");
mrMing.setAge(18);
mrMing.setAddress("赛博坦星球");
// 先打印一边对象信息
System.out.println("序列化前:" + mrMing.toString());
// 使用流进行序列化
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("mrMing"));
outputStream.writeObject(mrMing);
outputStream.close();
System.out.println();
// 从流中读取对象
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("mrMing"));
mrMing = (MrMing) inputStream.readObject();
System.out.println("从流中取出序列化过后的对象:" + mrMing.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
最终结果:
为什么使用 Transient:
如上面例子所说,在一些包含敏感信息、安全信息在网络上传递的时候,为了安全就不出现这些属性。或者一些没有价值的属性,也没有必要进行序列化,多多少少也会占点空间吧。具体还要根据情景来看是否需要使用。
~~OK,以上就是对 Transient相关的知识了,如有不对请指出,多多海涵。