问题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
。
在设计时如何决定定义瞬态? 有没有可以帮助我理解的实时场景?
答案 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)
以下案例 -
像ArrayList这样的API;提供自己的序列化机制。这可以通过将memeber声明为瞬态来完成,如下所示:
private transient Object [] elementData;
答案 4 :(得分:1)
如果您打算序列化您的对象,但是有些字段并不严格地是对象的一部分(例如那些在运行时从其他值计算的字段),那些应该是瞬态的,所以它们不会被序列化。
答案 5 :(得分:1)
作为指导原则,您应该序列化您希望能够还原的变量,否则您将无法以编程方式进行还原。同样,您应该确保不会不必要地保存数据;如果可以根据其他可序列化数据的处理轻松地重新填充变量,则应该采用该路径。