Discuss / Java / 大家安静一下,我补充几点。

大家安静一下,我补充几点。

Topic source

反序列化时,由JVM直接构造出Java对象,不调用构造方法,构造方法内部的代码,在反序列化时根本不可能执行。

廖老师的这句话,其实是有前提的。请看下面的截图,截图来自JDK自带的jar包rt.jar里面的java.io.Serializable.class里面的Java doc源码。

截图上面的意思是,父类A有俩个字段但是没有实现Serializable接口,但是子类B又有俩个字段并且实现了Serializable序列化接口。此时我要序列化子类B,没问题可以序列化成功。但是如果你要反序列化子类B,你要保证子类B的父类A必须有可访问的无参构造方法。

注意,同学们超级注意了,接下来我要反序列化子类B,这个时候假如父类A没有无参构造方法或者父类A将无参构造方法私有化了。我们返序列化子类B的时候会报错:Exception in thread "main" java.io.InvalidClassException: com.test.io.imooc.serializable.Bar3; no valid constructor。

总结下来就是:1、实现了Serializable序列化接口的类,在反序列化的的时候构造方法不会被调用。2、没有实现****Serializable序列化接口的类并且这个类是某个实现了****Serializable序列化接口的父类,那么反序列化子类的时候,JVM会自动调用父类的无参构造方法,并且父类无参构造方法里面的代码也会被执行。**
**

1、实现了Serializable序列化接口的类以及这个类的子类,在反序列化的的时候构造方法不会被调用。


  • 1

Reply