transient关键字的用途是什么以及何时使用它?

时间:2013-01-18 16:58:28

标签: java java-ee serialization

  

可能重复:
  what does the keyword “transient” means in java?

我在java中读到了transient关键字。我的理解是什么?它被用于领域。如果我们声明transient关键字,则该字段不会被序列化。什么时候序列化是在java中为一个字段发生的?如果没有扩展Serializable接口,它会如何发生?如果我说错了,请纠正我。这个问题可能重复。

  • 卡纳安

3 个答案:

答案 0 :(得分:2)

当您想要将对象从Java堆传输到平面文件或网络时,需要进行序列化;基本上只要对象需要离开JVM并且需要以某种方式存储它以便可以重新创建它。

因此,现在如果在序列化后再次创建对象时,您认为不需要填充任何变量,那么您将其声明为瞬态变量。例如,物体上的温度。我们知道,如果我们以任何方式重新创建对象,那么当前温度不具有任何意义,那么为什么要在序列化过程中对其进行序列化。

答案 1 :(得分:2)

您可以将它用于要从序列化中排除的字段。序列化仅适用于类或层次结构中的类实现接口的类。例如,java.lang.Throwable实现java.io.Serializable,因此所有错误和异常都会继承该标记接口。

答案 2 :(得分:1)

序列化对象时,使用ObjectOutputStream“将其写下来”和ObjectInputStream“将其读回”。

通常,Java实现的默认行为足以用于序列化的“常用”。 transient关键字告诉JVM您不希望它保存(或恢复)变量的值。处理transient变量时应特别小心:在恢复序列化实例后,它们可能为null或值不一致。最好添加到可序列化的类

 private void writeObject(java.io.ObjectOutputStream out) throws IOException{
    out.defaultWriteObject();
}

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException{
    in.defaultReadObject();

    //here do something to re-initialize transient variables

}
通过这种方式,您可以为所有声明的瞬态插入特殊处理。 (请记住,可序列化类的构造函数仅在第一次使用时调用,而不是在从ObjectInputStream读取对象时调用

在所有其他不涉及序列化的上下文中transient并不意味着什么。