如何将字段标记为瞬态可以序列化对象
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
Explanation:即使对象实现java.io.Serializable
,也可能无法序列化对象,因为它可能包含不可序列化的实例变量。
现在我的问题是:
据我所知,transient 用于关闭序列化。 那么在这种情况下如何瞬态,帮助我们序列化foo?
transient
不会完全禁用序列化; 它只是标记了不会被序列化的成员。 它通常用于在对象被反序列化时不正确或不相关的东西,或者存储不太安全的东西(密码,解密数据,那种东西),或者可能不可序列化的东西很容易重建。
在这种情况下,我假设Loan
类不可序列化。 (如果是,那么A就是正确的。)将v3
标记为瞬态只是告诉Java不要担心该字段,而是继续并序列化其他字段。 这意味着未序列化的Foo
可能具有null v3
。 如果您还要存储Loan
,则需要跟踪足够的信息以随意重新创建Loan
,或者更改类Loan
以便它也实现java.io.Serializable
。
或者,如果需要控制序列化,可以实现( writeObject
, readObject
)方法。 但这可能有点麻烦。
那么在这种情况下如何瞬态,帮助我们序列化foo?
因为它允许您序列化其余的Foo,所以可序列化的其他成员。
首先,您确定贷款不可序列化吗? 如果是,那么B不适用。
另一方面,如果确实不是,则B和C是正确的。 transient
通常不会关闭序列化,但仅适用于与其关联的字段。 因此,序列化Foo不会传输v3字段的值。 在接收端,当重新初始化Foo实例时,序列化机制不会尝试从流中读取该字段,并将其保留为null。