为什么Java有瞬时字段?


当前回答

在我回答这个问题之前,我需要解释序列化,因为如果你理解了它在科学计算机中的含义,你可以很容易地理解这个关键词。

当对象通过网络传输/保存在物理介质(文件,…)上时,该对象必须“序列化”。序列化转换字节状态对象序列。这些字节在网络上发送/保存,并根据这些字节重新创建对象。

例子:

public class Foo implements Serializable 
{
 private String attr1;
 private String attr2;
 ...
}

现在,如果这个类中有一个字段不想传输或保存,可以使用transient关键字

private transient attr2;

这防止在序列化类时包含字段表单。

其他回答

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

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

根据谷歌短暂的意义==只持续很短的时间;短暂的

现在,如果您想在java中实现任何瞬态,请使用瞬态关键字。

Q: 在哪里使用瞬态?

A: 通常在java中,我们可以通过在变量中获取数据并将这些变量写入文件来将数据保存到文件中,这个过程称为序列化。现在,如果我们想避免将变量数据写入文件,我们会将该变量设置为瞬时变量。

transient int result=10;

注意:瞬态变量不能是局部变量。

因为并非所有变量都具有可序列化的性质。

序列化和反序列化是对称过程,如果不是,那么就不能期望结果被确定,在大多数情况下,未确定的值是没有意义的;串行化和反串行化是幂等的,这意味着您可以根据需要多次进行串行化,结果是相同的。

因此,如果Object可以存在于内存上,但不存在于磁盘上,那么Object就不能串行化,因为反序列化时计算机无法还原内存映射。例如,不能序列化Stream对象。

不能序列化Connection对象,因为它的状态也依赖于远程计算机。

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

在我回答这个问题之前,我需要解释序列化,因为如果你理解了它在科学计算机中的含义,你可以很容易地理解这个关键词。

当对象通过网络传输/保存在物理介质(文件,…)上时,该对象必须“序列化”。序列化转换字节状态对象序列。这些字节在网络上发送/保存,并根据这些字节重新创建对象。

例子:

public class Foo implements Serializable 
{
 private String attr1;
 private String attr2;
 ...
}

现在,如果这个类中有一个字段不想传输或保存,可以使用transient关键字

private transient attr2;

这防止在序列化类时包含字段表单。