📜  Java中的transient关键字

📅  最后修改于: 2020-03-29 07:07:04             🧑  作者: Mango

transient是用于序列化的变量修饰符。在序列化时,如果我们不想将特定变量的值保存在文件中,则可以使用transient关键字。当JVM遇到transient关键字时,它会忽略变量的原始值,并保存该变量数据类型的默认值。
transient关键字在满足安全性约束方面起着重要作用。在现实生活中,有许多我们不想在文件中保存私有数据的示例。transient关键字的另一种用途是不序列化可以使用其他序列化对象或系统计算/得出的变量(例如人的年龄,当前日期等)。
实际上,我们仅序列化表示实例状态的那些字段,所有序列化都将把对象的状态保存到文件中。在序列化过程中,将transient关键字与类的私有private字段一起使用是个好习惯。

// Java说明使用transient躲避序列化
class Test implements Serializable
{
    // 让密码password成为transient
    private transient String password;
    // 让年龄age成为transient
    transient int age;
    // 序列化其他字段
    private String username, email;
    Date dob;
    // 其他code
}

transient和static:由于静态static字段不是对象状态的一部分,因此,将transient关键字与静态static变量一起使用不会产生任何影响,没有编译错误。

transient和final: final变量通过它们的值直接序列化,因此将final变量声明为transient并没有影响。没有编译时错误。

// Java展示transient关键字
// 文件名 Test.java
import java.io.*;
class Test implements Serializable
{
    // 常规变量
    int i = 10, j = 20;
    // Transient变量
    transient int k = 30;
    // 使用transient合法
    transient static int l = 40;
    transient final int m = 50;
    public static void main(String[] args) throws Exception
    {
        Test input = new Test();
        // 序列化
        FileOutputStream fos = new FileOutputStream("abc.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(input);
        // 逆序列化
        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