深入理解 Java 中的 transient 关键字

在 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

说明:

  • ij 是正常序列化的。
  • ktransient 的,因此在反序列化后它获得了默认值 0。
  • ltransient 静态变量,所以它的值保持为 40,不受序列化影响。
  • mtransient final 变量,因此它保留了其常量值 50。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/29055.html
点赞
0.00 平均评分 (0% 分数) - 0