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

zen*_*ngr 13 java serialization transient

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

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

答案:D

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

现在我的问题是:

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

cHa*_*Hao 21

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

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

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