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

2022-09-04 07:51:08
public class Foo implements java.io.Serializable {
   private int v1;
   private static double v2;
   private Loan v3 = new Loan();
}

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

答:D

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

现在我的问题是:

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


答案 1

transient不完全禁用序列化;它只是标记不会序列化的成员。它通常用于对象未序列化时不正确或不相关的内容,或者存储起来不太安全的内容(密码,解密的数据,诸如此类的东西),或者可以轻松重建的不可序列化的东西。

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

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


答案 2

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

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