反序列化后如何获取瞬态变量原始值

时间:2014-08-12 18:32:17

标签: java serialization deserialization transient

使用 Transient 变量,我们可以停止序列化所需的值,但在反序列化后,我们将获得瞬态变量的默认值,并且我们将丢失原始值。那么创建瞬态变量的需求是什么,我们可以跳过创建变量本身。如果可能的话,如何获得瞬态变量的原始值。

4 个答案:

答案 0 :(得分:1)

瞬态变量的概念是,以序列化形式保持其原始值没有意义,因为在反序列化之后它不会处于有效状态(例如,想想,关于保持开放Socket)的成员变量。

在对象的反序列化之后,瞬态变量应该通过某种方法调用来初始化(例如,如果该成员的getter为null,则该成员的getter可以初始化它)。

答案 1 :(得分:1)

至于的解释为什么有一个瞬态关键字? /瞬态变量有什么用?我想指出这个问题:  Why does Java have transient fields?

它巧妙地解释了瞬态变量用于i.a.出于性能原因,比如预先计算来自存储在对象中的其他值的组合的某些值。您需要在代码中使用它们,但是当对象被序列化并在某处发送/存储时,它们只会占用宝贵的空间 如Eran所述,另一种用途是将变量存储在对象中,这些变量对于它的功能是必要的,但同时又取决于底层系统。

至于如何获得瞬态变量的原始值?,没有干净的方法可以做到这一点。特别是如果您在两个应用程序之间进行序列化和对象传输,则无法简单地数据

答案 2 :(得分:0)

考虑非常基本的情景Person

  

class Person {    
私人姓名    
私人DOB    
私人时代}

在此,存储名称和DOB是有意义的,但存储Age并不是因为它总是每天都在变化,所以将其声明为transient

并且可以始终计算为Current date - DOB,这将给出准确的年龄。

答案 3 :(得分:0)

首先,transient关键字与实例变量一起使用,以将它们从序列化过程中排除。如果某个字段是暂时的,则其值不会被保留。

在Hibernate中可以看到Transient变量的完美使用。 对于数据库表中的示例,只有两列(name and surname) 但是在你的POJO实体中,你有三个变量(name , surname and age),在这种情况下,你可以使Transient到age字段,你可以保存你的实体而不会抱怨,因为年龄变量变得不会持续存在。