【问题标题】:How does marking a field as transient make it possible to serialise an object将字段标记为瞬态如何使序列化对象成为可能
【发布时间】:2011-07-07 19:32:54
【问题描述】:
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 标记为瞬态,则 Foo 的实例是可序列化的。
D. b 和 c

答案:D

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

现在我的问题是:

据我所知,transient 是used 来关闭序列化。那么在这种情况下transient是如何帮助我们序列化foo的呢?

【问题讨论】:

    标签: java serialization transient


    【解决方案1】:

    transient 并没有完全禁用序列化;它只是标记不会被序列化的成员。它通常用于在对象未序列化时不正确或不相关的内容,或者存储不太安全的内容(密码、解密数据等),或者可能无法序列化的内容很容易重建。

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

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

    【讨论】:

      【解决方案2】:

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

      因为它允许你序列化Foo的rest,其他可序列化的成员。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-26
          • 2016-07-01
          • 1970-01-01
          • 2022-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多