我读过transient
java中的关键字。我的理解是?它用于字段。如果我们声明transient
关键字,该字段将不会被序列化。什么时候在java中为一个字段发生可序列化?如果没有我扩展Serializable
接口,它会如何发生?如果我说错了,请纠正我。这个问题可能是重复的。
- 坎南
我读过transient
java中的关键字。我的理解是?它用于字段。如果我们声明transient
关键字,该字段将不会被序列化。什么时候在java中为一个字段发生可序列化?如果没有我扩展Serializable
接口,它会如何发生?如果我说错了,请纠正我。这个问题可能是重复的。
当您想将对象从 Java 堆传输到平面文件或网络上时,需要进行序列化;基本上每当对象需要离开 JVM 并且需要以某种方式存储以便可以再次重新创建它时。
因此,现在,如果在序列化后再次创建对象时您认为不需要填充任何变量,那么您将其声明为瞬态。例如物体的温度。我们知道,如果我们以任何方式重新创建对象,这个当前温度没有任何意义,那么为什么要在序列化过程中对其进行序列化。
您可以将它用于要从序列化中排除的字段。序列化仅适用于类或其类层次结构中的类实现接口的类。例如,java.lang.Throwable
implements java.io.Serializable
,因此所有错误和异常都继承该标记接口。
当您序列化一个对象时,您使用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
没有任何意义。