3

在学习java序列化概念的过程中,我一度感到困惑。在java序列化过程中,我们使用2个关键字来防止序列化,即transient和static。如果我不想保存实例变量,我应该使用哪个关键字,两者的作用完全相同。

Class A implements Serializable{
  private static int x;
  private transient int y;
  private transient static int x;
}

在上面的代码中,所有三个实例变量都没有保存在序列化过程中。建议使用哪个关键字来防止序列化。为什么两个关键字具有几乎相同的功能。防止序列化的推荐声明方式是什么。如果我错了,请纠正我,我还在学习。

4

4 回答 4

12

关键字将static实例变量转换为静态变量。副作用是该字段不再序列化......因为它不再是一个字段。

静态变量是类的变量。实例变量是对象的变量,或类的实例。你不能盲目地从一个转到另一个。

阅读有关实例和静态变量的教程页面。

当然,transient关键字是要使用的正确关键字。

于 2012-06-14T10:45:16.080 回答
4

你很困惑:static字段不是实例变量,它们是类范围的变量。通过声明一个 field static,这个类的所有实例共享同一个字段——它不再是任何特定对象的一部分,这导致它不被序列化。

为了专门防止序列化仅transient适用...

于 2012-06-14T10:44:19.347 回答
2

瞬态(在 JAXB XmlTransient 中)表示数据是短暂的而不是永久重要的,因此在涉及持久性问题时应该忽略。

静态意味着该值适用于类级别,因此对多个实例进行序列化/反序列化将是不安全的,因为值会发生冲突。

于 2012-06-14T10:47:06.553 回答
0

好吧,让我再次定义序列化。

A serialization is a process in which we persist state of an object.

那么,任何静态变量都是对象状态的一部分吗?..绝对不是。它是一个类的所有对象之间共享的数据。很明显,任何静态变量都不应该与对象的状态一起序列化。

假设,我们被允许持久化一个对象的状态。稍后,如果此变量被其他对象/类本身更改,并且如果我们尝试反序列化该对象,那么该静态变量将保持什么值。会有冲突。

因此,如果您想防止任何实例变量被序列化,请使用瞬态。当您反序列化对象时,它将使用默认值初始化。

于 2012-06-14T10:58:10.493 回答