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