【问题标题】:What is the use of transient variables? [duplicate]瞬态变量有什么用? [复制]
【发布时间】:2011-08-23 01:10:36
【问题描述】:

可能重复:
Why does Java have transient variables?

transient 关键字将用于防止特定变量的序列化。但是为什么我们不应该序列化数据呢?有没有内在的安全感?

【问题讨论】:

标签: java serialization transient


【解决方案1】:

如果您不想序列化任何变量/字段,请将其标记为瞬态。如果我们序列化银行余额、信用卡详细信息等,那么有人可以反序列化并使用它。

【讨论】:

    【解决方案2】:

    是的,它可能与安全有关,但原因也可能是该字段中的数据是从其他字段派生的,在这种情况下没有理由发送它。如果可以的话,节省带宽:)

    【讨论】:

      【解决方案3】:

      考虑一个将用户名和密码作为其字段之一的类。还要考虑在序列化之后在网络中传递这个对象并在其他地方反序列化它。

      在这样的场景中瞬态会有所帮助

      【讨论】:

        【解决方案4】:

        有些类本质上是不可序列化的,因为它们代表了管理 Java 环境之外的资源。例如FileOutputStream 不能真正被序列化,因为它代表一个打开的文件句柄。 Socket 也是如此:您无法保存和恢复“打开的套接字”。

        如果您想序列化具有该类型字段的某个对象,则必须将这些字段标记为瞬态。

        使用transient 的另一个原因是当您的类执行某种内部缓存时。例如,如果您的类可以进行计算,并且出于性能原因,它会缓存每个计算的结果,那么保存该缓存可能是不可取的(因为重新计算它可能比恢复它更快,或者因为旧的缓存值不太可能是任何用途)。在这种情况下,您会将缓存字段标记为瞬态。

        【讨论】:

        • 很好的解释。我想知道如果我们不设置像 FileOutputStream 瞬态这样的字段,它会在序列化/反序列化期间抛出任何异常吗?
        猜你喜欢
        • 2020-12-05
        • 2011-04-04
        • 1970-01-01
        • 2023-03-14
        • 2014-01-29
        • 2014-05-12
        • 1970-01-01
        • 2010-10-28
        相关资源
        最近更新 更多