Java 中的 transient 关键字

2025 年 5 月 1 日 | 阅读 5 分钟

在 Java 中,transient 关键字是一个修饰符,用于序列化(将对象转换为字节流的过程)。在一个类中,如果一个字段被标记为 transient,则该字段将从这个过程中排除。这意味着字段的值在对象序列化期间不会被保存;相反,在反序列化期间,它将被初始化为其默认值(例如,对象的 null 和整数的 0)。

为什么使用 transient 关键字?

transient 关键字可以与类的成员变量一起使用,以避免它们的序列化。例如,如果一个程序接受用户的登录详细信息和密码,但我们不想将原始密码存储在文件中。在这种情况下,我们可以使用 transient 关键字。当 JVM 读取 transient 关键字时,它会忽略对象的原始值,而是存储对象的默认值。

  1. 它阻止敏感或非必要数据被序列化。
  2. 反序列化期间,瞬态字段将重置为其默认值。

语法

何时使用 transient 关键字?

  1. 它可用于数据成员派生自类同一实例中的其他数据成员的情况。
  2. 它可以应用于不代表对象状态的数据成员。
  3. 非序列化对象或类的成员可以使用 transient 修饰符。

transient 关键字示例

在下面的示例中,我们定义了一个名为 Student 的类,该类有两个数据成员:nameage。如果我们序列化对象,所有值都将被序列化,但我们不想序列化 age。所以,我们声明了 age 数据。当我们反序列化对象时,我们得到 transient 变量的默认值。请注意,age 字段已从序列化中排除,因此其值在反序列化期间被重置。

我们可以看到,学生的年龄返回 0,因为 age 的值没有被序列化。

示例

编译并运行

输出

Name: Peter
Age: 0

transient 关键字的优点

  • 保护敏感数据: 密码、安全令牌或个人信息等字段可以标记为 transient,以防止它们被序列化和暴露。
  • 防止无关数据的序列化: 我们可以排除不适合序列化的字段(例如,计算值或临时缓存),这可以减少序列化对象的的大小。
  • 提高性能: 通过在序列化期间跳过非必要字段,可以提高序列化/反序列化的时间和内存使用。
  • 避免不可序列化的依赖关系: 如果一个字段引用一个不可序列化的对象(如线程、套接字或流),将其标记为 transient 允许对象的其余部分仍被序列化。

transient 关键字的缺点

  • 数据丢失: 瞬态字段在序列化期间不会被保存,因此它们将在反序列化后变为 null(对于对象)、0(对于数字)或 false(对于布尔值),除非手动恢复。
  • 需要手动处理: 如果需要在反序列化后重新初始化或重建瞬态字段,我们必须在代码中处理它(例如,在 readObject() 方法中)。
  • 如果使用不当可能导致错误: 如果开发人员无意中将一个关键字段标记为 transient,则可能导致对象状态不完整和细微的错误。
  • 没有序列化则无效: transient 关键字仅在序列化的上下文中应用。如果我们没有序列化对象,它就没有任何作用。

Java transient 关键字 MCQ

1. Java 中的 transient 关键字表示什么?

  1. 它不能被序列化
  2. 它可以被序列化
  3. 它是一个 final 变量
  4. 它是一个 static 变量

答案:1)

说明: transient 关键字可以与类的成员变量一起使用,以避免它们的序列化。


2. 下列哪些类型可以标记为 transient?

  1. 原始类型
  2. 引用类型
  3. 字符串类型
  4. 只有 1 和 2

答案:4)

说明: 在 Java 中,transient 关键字可以与任何数据类型一起使用,例如 int、String 或对象,以指示应从序列化中排除一个字段。


3. transient 关键字主要用于________?

  1. 出于安全原因
  2. 用于减小文件大小
  3. 用于提高性能
  4. 以上全部

答案:1)

说明: transient 关键字可以与类的成员变量一起使用,以避免它们的序列化。例如,如果一个程序接受用户的登录详细信息和密码,但我们不想将原始密码存储在文件中。在这种情况下,我们可以使用 transient 关键字。


4. 下列哪个不会被序列化?

  1. 静态变量
  2. 瞬态变量
  3. Final 变量
  4. 以上全部

答案:2)

说明

transient 与 static: Static 字段不是对象状态的一部分;static 变量与 transient 关键字没有用处。

transient 与 final: Final 变量会直接通过它们的值进行序列化,因此将 final 变量声明为 transient 是没有用的。

因此,答案 transient 变量将不会被序列化。


5. 序列化期间 transient 变量会发生什么情况?

  1. 它们被保留
  2. 它们被忽略
  3. 它们变为 static
  4. 它们被转换为默认值

答案:4)

说明: 在序列化期间,瞬态变量不包含在序列化对象的表示中。它们的值不会存储在序列化文件中,也不会被传输。相反,当对象被反序列化时,这些变量将被初始化为其默认值。


下一主题Java 网络