首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将字段标记为瞬态字段以使序列化对象成为可能

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

Stack Overflow用户
提问于 2011-03-03 05:29:22
回答 3查看 41.5K关注 0票数 13
代码语言:javascript
复制
public class Foo implements java.io.Serializable {
   private int v1;
   private static double v2;
   private Loan v3 = new Loan();
}

选项:

A.可以序列化Foo的实例,因为Foo实现了可序列化。

不能序列化Foo的实例,因为Foo包含不可序列化的实例变量v3。

如果将v3标记为瞬态,Foo的实例是可序列化的。

D. b和c

答:d

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

现在我的问题是:

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-03 05:46:50

transient并不完全禁用序列化;它只是标记不会序列化的成员。它通常用于对象未序列化时可能不正确或不相关的东西,或者存储时不太安全的东西(密码、解密数据之类的东西),或者可以很容易重建的不可串行化的东西。

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

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

票数 23
EN

Stack Overflow用户

发布于 2011-03-03 06:19:43

那么,在这种情况下,如何是暂时的,帮助我们序列化foo?

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

票数 2
EN

Stack Overflow用户

发布于 2011-03-03 05:46:36

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5177013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档