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