Java自定义序列化中void类型的readObject方法如何返回对象?
问题解答
你混淆了两个readObject方法的职责和调用顺序,核心逻辑其实很简单:
- 你代码里直接调用的
ObjectInputStream#readObject()是公有的入口方法,这个方法本身就负责返回反序列化后的对象,也是你拿到Employee实例的来源,和你自定义的私有readObject没有返回值的设定完全不冲突。 - 反序列化的执行顺序是这样的:
ObjectInputStream的公有readObject()方法读取序列化流里的类信息,判定要反序列化的是Employee类,会直接通过反射创建一个Employee的空实例(不会调用当前类的构造方法),这个实例就是最终要返回给你的对象原型。- 接下来JVM会检查
Employee类有没有定义签名为private void readObject(ObjectInputStream)的自定义方法:- 如果没有,就用默认逻辑给空实例的所有非transient属性赋值
- 如果有,就把刚才创建的空实例作为
this上下文,通过反射调用这个自定义的readObject方法,把输入流传入。你在这个方法里写的ois.defaultReadObject()、给address赋值等逻辑,都是直接修改当前this指向的那个空实例的属性,不需要把实例返回。
- 自定义
readObject执行完毕后,所有属性都已经填充完成,公有readObject()方法直接把这个填好属性的Employee实例返回,你做强制类型转换就可以正常使用了。
简单说就是:自定义的readObject只负责「填充对象属性」,不负责「创建并返回对象」,对象早就提前创建好了,你只是在已有的对象上修改内容而已,自然不需要返回值。
内容的提问来源于stack exchange,提问作者jackmiller
相关产品推荐
相关产品推荐

