3

transient在未实现的类中使用关键字是否有意义Serializable

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

4

5 回答 5

5

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

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

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

于 2015-02-12T04:25:45.800 回答
2

因为对象序列化比 Serializable 的简单实现更复杂(想想代理:代理对象可以实现 Serializable,但不是原始对象,并且在您的代码中您仍然使用原始类)
实现序列化的另一种方法是 Externalizable 接口可以完全控制您的对象序列化或(来自 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;

查看ObjectOutputStream javadoc以获取有关序列化过程/机制的更多信息。

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

于 2013-08-03T17:07:58.960 回答
1

通常,如果超类实现Serializable它的子类也是可序列化的。这是唯一可以使字段瞬态并且类不直接实现可序列化的情况,但除此之外,如果类不可序列化,则没有意义它们是短暂的。

于 2013-08-03T17:10:26.417 回答
1

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

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


取而代之的原因writeObject()是签名来自实现独立于序列化定义的接口。但是,它会阻止更改其签名。ObjectSerializableObjectOutputObjectOutputStream

public interface ObjectOutput {
  // ...
  void writeObject(Object obj);
}
于 2013-08-03T16:53:34.927 回答
0

不,这没有意义。

class State {
    // The 'transient' modifier has no effect here because
    // the 'State' class does not implement 'Serializable'.
    private transient int[] stateData;
}
于 2018-08-17T05:57:20.817 回答