如何将字段标记为瞬态可以序列化对象

时间:2011-03-03 05:29:23

标签: java serialization transient

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

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

答案:D

说明:即使对象实现java.io.Serializable,对象也可能无法序列化,因为它可能包含不可序列化的实例变量。

现在我的问题是:

据我所知,transient used可以关闭序列化。那么在这种情况下如何瞬态,帮助我们序列化foo?

3 个答案:

答案 0 :(得分:20)

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

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

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

答案 1 :(得分:2)

  

那么在这种情况下如何瞬态,   帮助我们序列化foo?

因为它允许您序列化Foo的 rest ,所以 可序列化的其他成员。

答案 2 :(得分:0)

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

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