Java中的transient关键字
瞬态是序列化中使用的变量修饰符。在序列化时,如果我们不想将特定变量的值保存在文件中,那么我们使用瞬态关键字。当JVM遇到transient关键字时,它会忽略变量的原始值并保存该变量数据类型的默认值。
瞬态关键字在满足安全约束方面起着重要作用。有各种现实生活中我们不想将私人数据保存在文件中的例子。瞬态关键字的另一个用途是不序列化可以使用其他序列化对象或系统(例如人的年龄、当前日期等)计算/导出其值的变量。
实际上,我们只序列化那些表示实例状态的字段,毕竟序列化即将将对象的状态保存到文件中。在序列化过程中,对类的私有机密字段使用瞬态关键字是一个好习惯。
// A sample class that uses transient keyword to
// skip their serialization.
class Test implements Serializable
{
// Making password transient for security
private transient String password;
// Making age transient as age is auto-
// computable from DOB and current date.
transient int age;
// serialize other fields
private String username, email;
Date dob;
// other code
}
瞬态和静态:由于静态字段不是对象状态的一部分,因此将瞬态关键字与静态变量一起使用没有用处/影响。但是没有编译错误。
瞬态和最终:最终变量直接由它们的值序列化,因此将最终变量声明为瞬态没有任何用处/影响。虽然没有编译时错误。
// Java program to demonstrate transient keyword
// Filename Test.java
import java.io.*;
class Test implements Serializable
{
// Normal variables
int i = 10, j = 20;
// Transient variables
transient int k = 30;
// Use of transient has no impact here
transient static int l = 40;
transient final int m = 50;
public static void main(String[] args) throws Exception
{
Test input = new Test();
// serialization
FileOutputStream fos = new FileOutputStream("abc.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(input);
// de-serialization
FileInputStream fis = new FileInputStream("abc.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Test output = (Test)ois.readObject();
System.out.println("i = " + output.i);
System.out.println("j = " + output.j);
System.out.println("k = " + output.k);
System.out.println("l = " + output.l);
System.out.println("m = " + output.m);
}
}
输出 :
i = 10
j = 20
k = 0
l = 40
m = 50