在 Java 中,我们可以使用 transient 关键字来排除对象中特定字段的序列化。这确保了当对象被转换为字节流时,那些敏感或不必要的数据不会被保存下来。
- 防止敏感信息(如密码)被序列化。
- 确保当对象被写入文件或通过网络发送时,某些字段不会被持久化。
- 默认的序列化过程会忽略被声明为
transient的字段。 - 在反序列化过程中,
transient字段会被初始化为默认值。
import java.io.Serializable;
import java.util.Date;
class Test implements Serializable {
private transient String password; // will not be serialized
transient int age; // will not be serialized
private String username, email; // will be serialized
Date dob; // will be serialized
}
说明:
- INLINECODE19f3d895 和 INLINECODEb316fb47 被标记为
transient,因此它们不会被序列化。 - INLINECODE16a86c65、INLINECODE8a33a36d 和
dob会照常进行序列化。
transient 与 static
- 静态变量属于类,而不属于对象实例。
- 它们不是序列化状态的一部分。
- 对静态变量使用
transient关键字不会产生实际效果。 - 不会发生编译错误。
transient 与 final
- Final 变量是使用其常量值来进行序列化的。
- 将一个变量声明为 INLINECODEb0c56bee 的同时再声明为 INLINECODE5c644993 不会有任何影响。
- 不会发生编译错误。
示例: 结合使用 transient、static 和 final
import java.io.*;
class Test implements Serializable {
int i = 10, j = 20;
transient int k = 30; // transient instance variable
transient static int l = 40; // transient static variable
transient final int m = 50; // transient final variable
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);
// Deserialization
FileInputStream fis = new FileInputStream("abc.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Test output = (Test) ois.readObject();
// Output values
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
说明:
- i 和 j 是正常序列化的。
- k 是
transient的,因此在反序列化后它获得了默认值 0。 - l 是
transient静态变量,所以它的值保持为 40,不受序列化影响。 - m 是
transientfinal 变量,因此它保留了其常量值 50。