【问题标题】:Any real time example for transient variable in javajava中瞬态变量的任何实时示例
【发布时间】:2014-02-12 01:54:30
【问题描述】:

来自问题Why does Java have transient fields?。我能够理解瞬态。但是,在设计时无法评估使用瞬态关键字。

public class A implements Serializable 
{
    public String s;
    public transient ts; 
}

如果我以另一种方式做同样的事情..

public class A implements Serializable 
{
    public String s;
    //public transient ts;//removing this variable.

} 

并使用另一个类并在类内定义方法并定义变量ts并进行操作并将s的值保持为业务定义。

问题

我没有在网络上找到任何我将决定定义变量transient 的实时示例。

我如何决定在设计时定义瞬态? 是否有任何实时场景可以帮助我理解?

【问题讨论】:

  • 我想ts 的类型是必要的,因为答案将取决于您在一定程度上序列化的内容。
  • 检查 Java 集合 API,如 ArrayList。如果您想覆盖 writeObject/readObject 方法,它会很有帮助。

标签: java serializable transient


【解决方案1】:

说白了:任何标记为瞬态is not saved if/when the object is serialized.的字段

例如,假设您有一个需要序列化的实体,但该实体有一个数据字段,总而言之,它是海量的:

public class SerializeMe implements Serializable {
    private Integer id;
    private String value;
    private BigMatrix bigMatrix = BigMatrixFactory.fromValues(id, value).build();

    public BigDecimal doExpensiveOperation() {
        BigDecimal result = BigDecimal.ZERO;
        for(BigDecimal value : bigMatrix.getAllValuesFromAllMatrixFields() {
            matrixMultiply(result, value);
        }
        return result;
    }
}

真的不希望 BigMatrix 被序列化,因为您将序列化大量不需要重建对象的数据(注意,它可以是简单地使用构建器模式构建,给定 ID 和值)。

举个简单的例子,这可能没什么大不了的。但是,如果您要通过网络发送这个特定实体,那将是一笔巨大的交易——您现在不仅需要传输您想要的实体,而且还需要传输一些关于它的内部状态生成。

【讨论】:

  • 在那种情况下,为什么要让它成为实体的一部分。
【解决方案2】:

瞬态变量是不能序列化的变量。 transient 关键字可用于指示 Java 虚拟机该变量不是对象持久状态的一部分。

这可以用于只需要保存类中的一些字段而其他字段实际上是从现有的.

中派生的场景。
class MyExample  implements Serializable
{
    private Date currentDate;
    private transient String dateValueInString;     // this will not be saved

    // This methos provides the date in the format 2 feb
    private void generatederivedValue()
    {
       dateValueInString = currentDate.getDay() + " " +   convertToStringMonth(currentDate.getMonth());
    }
}

所以当上述类的对象被序列化时,不会保存dateValueInString。当这个类的数千个对象被序列化时,这将有助于节省空间。

【讨论】:

    【解决方案3】:

    如果可以在运行时计算字段,则可以将它们设为瞬态,这样序列化和反序列化它们的成本要低得多。

    【讨论】:

      【解决方案4】:

      以下案例——

      1. 如果您有一些安全信息(例如密码、SSN 号等),则将属性声明为瞬态特别有用。
      2. ArrayList 等 API;提供了自己的序列化机制。这可以通过将成员声明为瞬态来完成,如下所示:

        私有瞬态对象[] elementData;

      【讨论】:

        【解决方案5】:

        如果您打算序列化您的对象,但有些字段严格来说不是对象的一部分(例如在运行时从其他值计算的字段),那么这些字段应该是瞬态的,因此它们不会被序列化。

        【讨论】:

        • 我的问题不是关于“什么是短暂的”。如何在设计阶段决定在哪里定义“瞬态”?你可以检查上面的两个类。如果我选​​择第二种方法有什么问题吗?
        • 我回答了你。不属于对象的字段,例如从其他字段或不需要持久化(或者更确切地说,检索)的字段计算的字段。
        【解决方案6】:

        作为准则,您应该序列化您希望能够恢复的变量,否则您将无法以编程方式恢复。同样,您应该确保不会不必要地保存数据;如果可以根据其他可序列化数据的处理轻松地重新填充变量,则应采用该方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-25
          • 1970-01-01
          • 2020-07-06
          • 2019-06-23
          • 1970-01-01
          • 2013-04-23
          • 2021-11-29
          • 2018-07-12
          相关资源
          最近更新 更多