为什么Java有瞬时字段?


当前回答

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

其他回答

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

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

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

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

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

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

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

简单地说,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关键字的主要目的。