Java 在不可序列化的类中使用transient关键字

Java 在不可序列化的类中使用transient关键字,java,serializable,transient,Java,Serializable,Transient,在未实现可序列化的类中使用transient关键字是否有意义 因为未实现可序列化的类仍然可以由ObjectOutputStream序列化 因为未实现可序列化的类仍然可以由ObjectOutputStream序列化 这是不正确的。那会给你带来麻烦 writeObject()采用对象而不是Serializable的原因是签名来自于实现接口ObjectOutput,该接口是独立于序列化定义的。但是,它会阻止ObjectOutputStream更改其签名 public interface Object

在未实现可序列化的类中使用
transient
关键字是否有意义

因为未实现
可序列化
的类仍然可以由
ObjectOutputStream
序列化

因为未实现
可序列化
的类仍然可以由
ObjectOutputStream
序列化

这是不正确的。那会给你带来麻烦


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

public interface ObjectOutput {
  // ...
  void writeObject(Object obj);
}

因为对象序列化比Serializable的简单实现更复杂(想想代理:代理对象可以实现Serializable,但不能实现原始对象,并且在代码中仍然使用原始类)
实现序列化的另一种方法是外部化接口,以完全控制对象序列化或(从javadoc):
在序列化和 反序列化过程必须实现具有这些精确签名的特殊方法:

private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream) throws IOException
private void readObjectNoData() throws ObjectStreamException;
有关序列化进程/机制的更多信息,请参阅


编辑:要回答您的问题,transient是一个关键字,仅在序列化上下文中使用,因此带有transient字段的not
Serializable
对象没有意义

通常,如果超类实现了
Serializable
它的子类也可以序列化。这是唯一可以使字段为transient而类没有实现的情况可直接序列化,但除此之外,如果该类不可序列化,则将其设置为瞬态是没有意义的。

出于几个原因,您可能仍希望将其标记为瞬态。我马上想到的两个问题是:

  • 它可以帮助传达字段的语义目的。也就是说,它可以帮助阅读代码的人理解变量的用途

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


    • 不,这没有意义

      class State {
          // The 'transient' modifier has no effect here because
          // the 'State' class does not implement 'Serializable'.
          private transient int[] stateData;
      }
      

      这是一个有趣的注释,但它没有回答OP的问题。在这种情况下,该类还通过继承实现了可序列化。