前语
今天在看项目代码时候,看到了下面这样一行代码,用transient
润饰了一个变量,首要作用是做一个全局开关。说实话我是第一次看到这个关键字。激发了我的好奇心,所以就了解一下这是何方神圣。
/**
* 全局开关
*/
public static transient boolean running = true;
transient 是什么?
在 Java 中,transient 是一个关键字,用于指定一个类的字段(成员变量)在序列化时应该被疏忽。在 Java 目标序列化期间,目标的状态被转换为字节省,以便在网络上传输或持久保存到磁盘。假如一个字段被标记为 transient,那么它的值不会被序列化,在反序列化时会被康复其默认值。
简略示例
public class Example implements Serializable {
private String name;
private transient int age;
public Example(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Example{name='" + name + "', age=" + age + "}";
}
public static void main(String[] args) throws Exception {
String dir = "/Users/ryan/Desktop/";
// 创立一个Example目标并序列化到文件
Example obj = new Example("Ryan", 20);
System.out.println("Before serialization: " + obj);
OutputStream outputStream = Files.newOutputStream(Paths.get(dir + "example.ser"));
try (ObjectOutputStream out = new ObjectOutputStream(outputStream)) {
out.writeObject(obj);
}
// 从文件中反序列化Example目标
InputStream inputStream = Files.newInputStream(Paths.get(dir + "example.ser"));
try (ObjectInputStream in = new ObjectInputStream(inputStream)) {
System.out.println("After deserialization: " + in.readObject());
}
}
}
执行成果:
Before serialization: Example{name='Ryan', age=20}
After deserialization: Example{name='Ryan', age=0}
在上述示例中,咱们创立了一个名为 Example
的类,并在其中界说了两个字段 name
和 age
,其中 age
被标记为 transient
。然后,咱们创立了一个 Example
目标并将其序列化到名为 example.ser
的文件中。
接着,咱们从文件中反序列化了刚刚序列化的 Example
目标,并将其赋值给一个新的目标 newObj
。然后,咱们打印出了原始目标和反序列化后的目标。能够看到,在反序列化后,age
字段的值被康复为其默认值 0。
运用场景
序列化敏感数据
有些目标包含一些敏感信息,如密码、拜访令牌等,这些信息在目标序列化时需要被维护,以防被未授权的用户拜访和泄露。
前进序列化功能
有些目标中的字段可能会影响序列化和反序列化的功能,如包含大量数据的目标,这些数据可能会在网络传输或磁盘存储期间添加延迟和负载,运用 transient 关键字能够排除这些字段,前进序列化功能。
暂时数据
有些字段仅用于目标的内部计算或暂时存储数据,这些数据在序列化时无需保留,因而能够运用 transient 关键字来疏忽这些字段,从而减少序列化后目标的巨细。
需要注意的点
- transient关键字只能润饰变量,而不能润饰方法和类。
- transient标记的变量地点的类必须完成Serializable接口。
- transient标记的变量在反序列化时会被初始化为默认值,需要在程序中手动进行初始化操作。
总结
transient 关键字只是暂时地在序列化过程中疏忽了该字段,而不是永久性地从目标中删去该字段。在反序列化时,该字段将被康复为其默认值。因而,假如需要永久地从目标中删去一个字段,直接将其从类中彻底删去。
应该很少有人,会在项目中运用这个关键字吧,所以它值得被遗忘。
结尾
假如觉得对你有帮助,能够多多谈论,多多点赞哦,也能够到我的主页看看,说不定有你喜欢的文章,也能够随手点个重视哦,谢谢。
我是不一样的科技宅,每天前进一点点,体验不一样的日子。咱们下期见!