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

what is the use of transient keyword and when to use it?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
what does the keyword"transient" means in java?

我在Java中阅读了关于EDCOX1×0的关键字。我理解的是什么?它被用于田野。如果声明transient关键字,该字段将不会序列化。可序列化何时发生在Java的字段中?.如果不扩展Serializable接口,会发生什么情况?如果我说错了请纠正我。这个问题可能是重复的。

  • 坎南


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


当您希望将对象从Java堆转移到平面文件或网络上时,需要进行序列化;基本上,每当对象需要从JVM中取出时,都需要以某种方式存储,以便可以重新创建。

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


序列化对象时,使用ObjectOutputStream来"写下来",使用ObjectInputStream来"读回来"。

通常,Java实现的默认行为对于串行化的许多"常用"来说是足够好的。transient关键字告诉JVM您不希望它保存(或恢复)变量的值。在处理transient变量时应该格外小心:在还原序列化实例之后,这些变量可能为空或具有不一致的值。最好将添加到可序列化类中

1
2
3
4
5
6
7
8
9
10
 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并不意味着什么。