将一个字段标记为瞬态如何使对象可序列化?

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标记为transient,则Foo的实例是可序列化的。
D. b和c

答案:D

解释:即使一个对象的类实现了java.io.Serializable,它也可能无法被序列化,因为它可能包含非可序列化的实例变量。

现在我的问题是:

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

3个回答

23

transient 并不能完全禁用序列化,它只是标记了不需要被序列化的成员。通常用于那些在反序列化时会出现错误或者变得不相关的东西,或者那些存储起来不够安全(例如密码,解密数据等)或者不可序列化但可以很容易地重建的东西。

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

此外,如果需要对序列化进行控制,您还可以实现一些方法(writeObjectreadObject)。但这可能会有点麻烦。


2

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

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


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接