本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
what does the keyword"transient" means in java?
号
我在Java中阅读了关于EDCOX1×0的关键字。我理解的是什么?它被用于田野。如果声明transient关键字,该字段将不会序列化。可序列化何时发生在Java的字段中?.如果不扩展Serializable接口,会发生什么情况?如果我说错了请纠正我。这个问题可能是重复的。
坎南
因此,您不必搜索,只需添加免责声明"此问题可能重复。"
他知道术语瞬态,但他想再次确认"如果类不扩展可序列化,那么瞬态就没有任何意义"。这一事实在任何地方都没有明确提及。+ 1
我在Java中搜索了瞬态,并阅读了关于StAcExpLoad中的瞬态问题。对不起,我看完后不清楚。
@我就是这么说的,支持你的问题,甚至反对它。
您可以将其用于要从序列化中排除的字段。序列化仅适用于类层次结构中的类或类实现接口的类。例如,java.lang.Throwable实现java.io.Serializable,因此所有错误和异常都继承该标记接口。
当您希望将对象从Java堆转移到平面文件或网络上时,需要进行序列化;基本上,每当对象需要从JVM中取出时,都需要以某种方式存储,以便可以重新创建。
因此,如果在序列化之后再次创建对象时,您认为不需要填充任何变量,那么您可以将其声明为瞬态变量。例如物体上的温度。我们知道,如果我们以任何方式重新创建对象,那么当前的温度没有任何意义,那么为什么要在序列化过程中对其进行序列化。
只有在我扩展Serializable时才需要,对吗?。用于将对象存储在文件或网络中供以后使用。
@是的,你是对的。
序列化对象时,使用ObjectOutputStream来"写下来",使用ObjectInputStream来"读回来"。
通常,Java实现的默认行为对于串行化的许多"常用"来说是足够好的。transient关键字告诉JVM您不希望它保存(或恢复)变量的值。在处理transient变量时应该格外小心:在还原序列化实例之后,这些变量可能为空或具有不一致的值。最好将添加到可序列化类中
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并不意味着什么。