为什么Java有瞬时字段?


当前回答

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

其他回答

简单地说,transient java关键字保护字段不被序列化为其非transient字段计数器部分。

在这个代码片段中,我们的抽象类BaseJob实现了Serializable接口,我们从BaseJob扩展,但不需要序列化远程和本地数据源;仅序列化organizationName和isSynced字段。

public abstract class BaseJob implements Serializable{
   public void ShouldRetryRun(){}
}

public class SyncOrganizationJob extends BaseJob {

   public String organizationName;
   public Boolean isSynced

   @Inject transient RemoteDataSource remoteDataSource;
   @Inject transient LocalDaoSource localDataSource;

   public SyncOrganizationJob(String organizationName) {
     super(new 
         Params(BACKGROUND).groupBy(GROUP).requireNetwork().persist());

      this.organizationName = organizationName;
      this.isSynced=isSynced;

   }
}

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

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

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

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

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

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

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

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

Q: 在哪里使用瞬态?

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

transient int result=10;

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