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字段的notSerializable
对象没有意义通常,如果超类实现了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的问题。在这种情况下,该类还通过继承实现了可序列化。