Java:为什么反序列化不调用构造函数?最好的解决方法是什么?

Java 1.5 的Java序列化规范说:

对于可序列化的对象,运行第一个不可序列化超类型的no-

arg构造函数。对于可序列化的类,将字段初始化为适合其类型的默认值。然后,通过调用特定于类的readObject方法来恢复每个类的字段,如果未定义这些字段,则通过调用defaultReadObject方法来恢复它们。请注意,在反序列化期间,不会为可序列化的类执行字段初始化程序和构造函数。

但是,这意味着如果将静态变量(例如计数器变量)放入类中,则不会像通常那样进行更新:

class Foo {

static int t;

public Foo() {

t++;

}

}

public class Bar extends Foo implements Serializable {

static int t;

public Bar() {

t++;

}

}

在这种情况下,如果对的一个实例进行Bar反序列化,则for的计数器Foo是正确的,for的计数器Bar是一对一的。

我想知道为什么反序列化不调用构造函数?由于这似乎会提高速度,但可能会导致潜在的问题。可以很容易地将编译器设计为生成“静态构造函数”,该“静态构造函数”仅更新将要更新的静态变量,并且在加载类时不依赖外部信息。

另外,我想知道避免这种情况的最佳方法是什么?我能想到的解决方案是将反序列化与对静态变量的操作打包在一起。

感谢您的任何提前输入!

回答:

反序列化不会调用构造函数,因为它的目的是在序列化对象时表达对象的状态,运行构造函数代码可能会干扰它。

以上是 Java:为什么反序列化不调用构造函数?最好的解决方法是什么? 的全部内容, 来源链接: utcz.com/qa/432108.html

回到顶部