为什么Java有瞬时字段?


当前回答

使用瞬时修饰符声明的字段将不会参与序列化过程。当对象被序列化(以任何状态保存)时,其瞬态字段的值在串行表示中被忽略,而瞬态字段以外的字段将参与序列化过程。这是transient关键字的主要目的。

其他回答

允许您定义不希望序列化的变量。

在对象中,您可能有不希望序列化/持久化的信息(可能是对父工厂对象的引用),或者序列化没有意义。将这些标记为“瞬时”意味着序列化机制将忽略这些字段。

使用瞬时修饰符声明的字段将不会参与序列化过程。当对象被序列化(以任何状态保存)时,其瞬态字段的值在串行表示中被忽略,而瞬态字段以外的字段将参与序列化过程。这是transient关键字的主要目的。

transient用于指示类字段不需要序列化。最好的例子可能是线程字段。通常没有理由序列化线程,因为它的状态非常“特定于流”。

当您不想共享一些与序列化相关的敏感数据时,需要使用它。

本机java系统以外的序列化系统也可以使用此修饰符。例如,Hibernate不会持久化标记为@Transient或Transient修饰符的字段。Terracotta也尊重这个修饰语。

我认为修饰语的比喻意义是“此字段仅供内存使用。不要以任何方式将其持久化或移出此特定VM。它不可移植”。也就是说,你不能依赖它在另一个VM内存空间中的值。与volatile非常类似,意味着您不能依赖特定的内存和线程语义。