1

可能重复:
关键字“transient”在java中是什么意思?

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

  • 坎南
4

3 回答 3

2

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

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

于 2013-01-18T17:01:39.120 回答
2

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

于 2013-01-18T17:04:30.527 回答
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没有任何意义。

于 2013-01-18T17:15:41.730 回答