反序列化时,由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序列化接口的类以及这个类的子类,在反序列化的的时候构造方法不会被调用。
Sign in to make a reply
跟人不要讲道理讲感情
廖老师的这句话,其实是有前提的。请看下面的截图,截图来自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会自动调用父类的无参构造方法,并且父类无参构造方法里面的代码也会被执行。**
**