美文网首页
Java 中 transient 关键字的作用

Java 中 transient 关键字的作用

作者: Vic_wkx | 来源:发表于2021-12-07 15:19 被阅读0次

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 + '\'' +
                '}';
    }
}

在这个对象中,我们将 passwordtransient 修饰。而 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)
    }
}

输出内容和刚才一样。

相关文章

网友评论

      本文标题:Java 中 transient 关键字的作用

      本文链接:https://www.haomeiwen.com/subject/gifaxrtx.html