13
public class Foo implements java.io.Serializable {
   private int v1;
   private static double v2;
   private Loan v3 = new Loan();
}

选项:
A. Foo 的实例可以被序列化,因为 Foo 实现了 Serializable。
B. Foo 的实例无法序列化,因为 Foo 包含不可序列化的实例变量 v3。
C. 如果将 v3 标记为瞬态,则 Foo 的实例是可序列化的。
D. b 和 c

答案:D

说明:一个对象可能不会被序列化,即使它的类实现了java.io.Serializable,因为它可能包含不可序列化的实例变量。

现在我的问题是:

据我所知,瞬态用于关闭序列化。那么在这种情况下transient是如何帮助我们序列化foo的呢?

4

3 回答 3

23

transient不会完全禁用序列化;它只是标记不会被序列化的成员。它通常用于在对象未序列化时不正确或不相关的内容,或者存储不太安全的内容(密码、解密数据等),或者可能无法序列化的内容很容易重建。

在这种情况下,我假设Loan该类不可序列化。(如果是,那么 A 将是正确的。)标记v3为瞬态只是告诉 Java 不要担心该字段,而是继续序列化其他字段。这意味着未序列化的Foo可能有 null v3。如果您也想存储Loan,您需要跟踪足够的信息以随意重新创建它,或者更改类Loan以便它也实现java.io.Serializable

或者,如果您需要控制序列化,可以实现一些方法 ( writeObject, )。readObject但这可能有点麻烦。

于 2011-03-03T05:46:50.923 回答
2

那么在这种情况下transient是如何帮助我们序列化foo的呢?

因为它允许您序列化Foo的其余部分,即可序列化的其他成员。

于 2011-03-03T06:19:43.433 回答
0

首先,您确定 Loan 不可序列化吗?如果是,则 B 不适用。

另一方面,如果确实不是,那么 B 和 C 是对的。transient通常不会关闭序列化,但仅针对与其关联的字段。因此,序列化 Foo 不会传输 v3 字段的值。在接收端,当重新初始化 Foo 实例时,序列化机制不会尝试从流中读取该字段,并将其保留为空。

于 2011-03-03T05:46:36.523 回答