java中瞬态变量的任何实时示例

时间:2014-01-22 06:19:13

标签: java serializable transient

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

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

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

6 个答案:

答案 0 :(得分:5)

说白了:任何标记为临时的字段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和值。)

在一个微不足道的例子中,这可能不是什么大不了的事。但是如果你通过网络发送这个特定的实体,这将是一个巨大的交易 - 你现在不仅需要转移你想要的实体,而且还要转移一些关于它的内部状态。生成。

答案 1 :(得分: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。当这个类的数千个对象被序列化时,这将有助于节省空间。

答案 2 :(得分:2)

如果可以在运行时计算字段,则可以使字段成为瞬态,这对序列化和反序列化要便宜得多。

答案 3 :(得分:2)

以下案例 -

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

      

    private transient Object [] elementData;

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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