transient
直译为暂时的、临时的,用于修饰类中的字段,表示该字段不是持久化存储的一部分。当我们将一个类序列化成字节流时,transient
修饰的字段将被忽略。
例:
public class Data implements Serializable {
private String userName = "Kevin";
private transient String password = "123456";
@Override
public String toString() {
return "Data{" +
"userName='" + userName + '\'' +
", password='" + password + '\'' +
'}';
}
}
在这个对象中,我们将 password
以 transient
修饰。而 userName
没有添加 transient
,当这个对象被序列化时,password
是不会被持久化存储的。我们来验证一下。
将此对象序列化,然后再反序列化查看结果:
@Test
public void test() throws IOException, ClassNotFoundException {
// Write
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/data.txt"));
oos.writeObject(new Data());
oos.close();
// Read
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("/data.txt"));
Data data = (Data) ois.readObject();
ois.close();
System.out.println(data.toString());
}
输出如下:
Data{userName='Kevin', password='null'}
可以看到,password
并没有被持久化存储。
另外,在 Kotlin
当中,transient
关键字以注解 @Transient
的形式存在,效果和 transient
关键字是一样的。例如,本例中,将 Data 类转换成 Kotlin:
data class Data(val userName: String = "Kevin", @Transient val password: String = "123456") : Serializable
测试类:
@Test
fun test() {
// Write
ObjectOutputStream(FileOutputStream("/data.txt")).use {
it.writeObject(Data())
}
// Read
ObjectInputStream(FileInputStream("/data.txt")).use {
println(it.readObject() as Data)
}
}
输出内容和刚才一样。
网友评论