Java 瞬变关键字的用途是什么?何时使用?

Java 瞬变关键字的用途是什么?何时使用?,java,jakarta-ee,serialization,Java,Jakarta Ee,Serialization,可能重复: 我读过java中的transient关键字。我所理解的是?。它被用于农田。若我们声明transient关键字,那个么该字段将不会被序列化。java中字段的可序列化是什么时候发生的?。如果我不扩展可序列化接口,它是如何发生的?。如果我说错了,请纠正我。这个问题可能是重复的 坎南 当您想要将对象从Java堆传输到平面文件或网络上时,需要序列化;基本上,只要对象需要离开JVM,并且需要以某种方式存储,以便可以重新创建它,就可以创建它 因此,如果在序列化之后再次创建对象时,您觉得不需要填充

可能重复:

我读过java中的transient关键字。我所理解的是?。它被用于农田。若我们声明transient关键字,那个么该字段将不会被序列化。java中字段的可序列化是什么时候发生的?。如果我不扩展可序列化接口,它是如何发生的?。如果我说错了,请纠正我。这个问题可能是重复的

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


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

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


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

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

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

序列化对象时,使用ObjectOutputStream将其写下,使用ObjectInputStream将其读回

通常,Java实现的默认行为对于序列化的许多常见用途来说已经足够好了。transient关键字告诉JVM您不希望它保存或恢复变量的值。在处理瞬态变量时应该格外小心:在恢复序列化实例后,它们很可能为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都没有任何意义。

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

通常,Java实现的默认行为对于序列化的许多常见用途来说已经足够好了。transient关键字告诉JVM您不希望它保存或恢复变量的值。在处理瞬态变量时应该格外小心:在恢复序列化实例后,它们很可能为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都没有任何意义。

只有在扩展Serializable right?时才需要它?。用于将对象存储在文件或网络中以供以后使用。@bharathi是的,您是正确的。仅当我扩展Serializable right?时才需要它?。用于将对象存储在文件或网络中以备日后使用。@bharathi是的,您是正确的,因此您没有搜索,而是添加了免责声明“此问题可能重复”。?他知道术语;但他想再次确认,如果类不扩展Serializable,那么transient就没有任何意义。这一事实在任何地方都没有明确提及+1@Deepak我搜索了java中的transient,并阅读了stackoverflow中有关transient的问题。抱歉,读完后我不清楚。@bharathi这就是我所说的支持你的问题,甚至对它投了更高的票。因此,你没有搜索,而是添加了免责声明“这个问题可能会重复。”?H
e了解术语;但他想再次确认,如果类不扩展Serializable,那么transient就没有任何意义。这一事实在任何地方都没有明确提及+1@Deepak我搜索了java中的transient,并阅读了stackoverflow中有关transient的问题。对不起,我看完后不清楚。@bharathi这就是我所说的支持你的问题,甚至投了赞成票。