在不可序列化的类中使用瞬态关键字

Min*_*ock 3 java serializable transient

transient在没有实现的类中使用关键字有意义Serializable吗?

因为没有实现的类Serializable仍然可以被ObjectOutputStream.

小智 5

出于多种原因,您可能仍希望将其标记为瞬态。立即想到的两个是:

  • 它可以帮助传达该领域的语义目的。即,它可以帮助任何阅读您代码的人了解变量的含义

  • 第三方库可能会使用关键字。例如,Google 的 Gson 库可以将任何对象序列化/反序列化到 JSON 或从 JSON 中序列化,无论它是否实现了 Serializable。在这种情况下,Gson 将(默认情况下)跳过标记为瞬态的字段。


Rav*_*yal 1

因为没有实现的类Serializable仍然可以被ObjectOutputStream.

这是不正确的。那会抛出一个NotSerializableException.


原因writeObject()是签名Object来自实现独立于序列化定义的Serializable接口。ObjectOutput但是,它会阻止ObjectOutputStream更改其签名。

public interface ObjectOutput {
  // ...
  void writeObject(Object obj);
}
Run Code Online (Sandbox Code Playgroud)