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

java中瞬态变量的任何实时示例,java,serializable,transient,Java,Serializable,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

从这个问题。我能理解这个瞬间。但是,在设计时无法对使用瞬态关键字进行评估

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.

} 
并在类内使用另一个类和define方法,定义变量
ts
,执行操作并将s的值持久化为业务定义

问题

我在网上没有找到任何实时示例,我将决定定义一个变量
transient

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

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

瞬态变量是无法序列化的变量。 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。当这个类的数千个对象被序列化时,这将有助于节省空间。

作为指导原则,您应该序列化希望能够还原的变量,否则您将无法以编程方式还原这些变量。同样,您应该确保没有不必要地保存数据;如果一个变量可以在处理其他可序列化数据的基础上很容易地重新填充,那么您应该采用这种方法。

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

简单地说:任何标记为临时字段

比如说,您有一个需要序列化的实体,但这个实体有一个数据字段,一句话,它是海量的:

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和值,就可以简单地构建它)

在一个小例子中,这可能没什么大不了的。但是如果你通过网络发送这个特定的实体,那将是一笔巨大的交易——你现在不仅要转移你想要的实体,还要转移一些可以生成的关于它的内部状态

  • 如果您有一些安全信息,如密码、SSN号等,则将属性声明为transient尤其有用
  • API类;提供自己的序列化机制。这可以通过将memeber声明为transient来实现,如下所示:

    私有瞬态对象[]元素数据


  • 我的问题不是关于“什么是暂时的”。如何在设计阶段确定“瞬态”的定义?你可以检查上面的两个类。。如果我去第二次进近有什么问题吗?我回答了你。不属于对象一部分的字段,例如从其他字段或不需要持久化(或者更确切地说,检索)的字段计算的字段。我认为
    ts
    的类型是必要的,因为答案在某种程度上取决于您未序列化的内容。请检查Java集合API,如ArrayList。如果您想重写writeObject/readObject方法,它会很有用。在这种情况下,为什么要将其作为实体的一部分呢。