反序列化对象后静态变量的值是多少?

Dan*_*Dan 1 java serialization static member

假设我创建了一个B类实例,它有一个静态变量x,在B类声明中赋值为3.在main()方法中,我这样做:

B b = new B();
b.x = 7; //allowed to use an instance to set the static member value
Run Code Online (Sandbox Code Playgroud)

在此之后,b被序列化然后反序列化.然后,出现以下行:

System.out.println ("static: " + b.x);
Run Code Online (Sandbox Code Playgroud)

有什么价值?7或3?

我知道静态变量不是序列化的,但是,因为整个类只有一个静态成员的副本,并且该值设置为7,如果在反序列化实例后保留它?

Ben*_*n S 8

这是发生的事情:

  1. 静态初始值设定项将值设置为3.
  2. 实例构造函数将值设置为7.
  3. 序列化不知道静态变量,它被忽略.
  4. 反序列化不知道静态变量,它被忽略.
  5. 值仍为7(来自构造函数中发生的更改)如果程序一直在运行,或者如果程序已关闭并重新启动,则静态初始化程序将其设置为3并且反序列化不会更改它.

如果需要所描述的逻辑,则需要添加另一个静态变量,该变量计算创建的实例数,writeObjectreadObject使用自定义逻辑覆盖和方法.


Jar*_*red 7

如果在JVM的同一个实例中对其进行反序列化,则第二个代码段将返回7.这是因为bx的值设置为7.由于B的实例已序列化并反序列化,因此未更改.

如果序列化对象,关闭JVM,调出新的JVM,然后反序列化对象(除了静态初始化之外的任何地方都不设置bx),bx的值将为3.