[英]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.