繁体   English   中英

序列化具有不可序列化父 class 的 object

[英]Serializing an object which has a non-serializable parent class

下面的代码是如何工作的?

     class A {
         int a = 10;
     }


     class B extends A implements Serializable{

      }



     public class Test {
       public static void main(String[] args){
        B obj = new B();
        obj.a = 25;


        //Code to serialize object B  (B b= new B()),
         // deserialize it and print the value of 'a'. 
      }
    }

即使我在代码中更改了“a”的值,代码也会打印 10。

对这种行为有什么解释吗?

a的默认值为 10 - 创建 object 时将设置为 10。 如果要进行实际测试,请在实例化后将其设置为不同的值,然后将其序列化。

至于您的更新 - 如果 class 不可序列化,则其字段不会序列化和反序列化。 只有可序列化子类的字段。

由于B扩展A ,因此它A 这意味着b instanceof Serializable返回true

所以,只要你尝试序列化的object对于instanceof Serializable检查返回true,就可以序列化了。 这适用于包含在此 object 本身中的任何复合对象。

但是你不能做A a = new A(); 并尝试序列化a .

考虑一下:

java.lang.Object没有实现Serializable 因此,在这种情况下,没有人能够序列化 Java 中的任何对象。 根本不是这种情况,此外,在涉及多个扩展公共超类型的 JavaBeans 的项目中,一般做法是使此超类型实现Serializable以便所有子类都不必这样做。

If class B extends class A, and A is not serializable, then all the instance variables of class A are initialized with their default values (which is 10 in this case) after de-serialization of class B.

如果您是可序列化的 class,但您的超类不可序列化,那么您从该超类继承的任何实例变量都将重置为在 object 的原始构造期间给出的值。 这是因为不可序列化的 class 构造函数将运行,事实上,第一个不可序列化 class 构造函数之上的每个构造函数也将运行,无论如何,因为一旦调用了第一个超级构造函数(在反序列化期间)。 它当然会调用它的超级构造函数,等等 inheritance 树。

如果父 class 不可序列化,则每次反序列化 object 时都会初始化其字段。 即 object 仍然需要构建。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM