Java中没有arg构造函数和反序列化
Posted
技术标签:
【中文标题】Java中没有arg构造函数和反序列化【英文标题】:No arg constructor and De serialization in Java 【发布时间】:2020-08-05 22:21:56 【问题描述】:DeSerialization
使用Serializable
接口机制使用Reflection
到deserialize
对象字节到对象。但默认no arg constructor
在此过程中不会被调用,因此不需要它。但是像Spring,Hibernate
等所有框架都需要no arg constructor
,即使它们使用反射。这不是矛盾还是我遗漏了什么?
【问题讨论】:
【参考方案1】:内置标准反序列化不使用标准反射来创建实例。
标准反射不能在不调用构造函数(不一定是无参数构造函数)的情况下创建实例。所以任何只使用标准反射的框架都需要调用构造函数来创建实例。
要在不调用构造函数的情况下创建实例,您需要某种特定于 jvm-vendor 的扩展,例如 Unsafe
。使用这些扩展由框架开发人员决定,许多人决定反对。 (XStream https://x-stream.github.io/faq.html 是我唯一知道实际使用它的)
【讨论】:
另一方面,超类无参数构造函数被调用......你确认了吗? 所有构造函数(java.lang.Object
除外)将调用另一个构造函数(超类或同一类中的一个)
@CodeScale 不确定“另一方面”是什么意思。标准序列化不调用任何构造函数,实例刚刚存在。
只在反序列化过程中说话..不是在正常使用对象创建过程中
@ghostrider 不确定到底使用了什么。它是一个 jvm 内置功能。所以它可以使用任何东西。但它不能只使用标准反射,因为它不能提供足够的功能。以上是关于Java中没有arg构造函数和反序列化的主要内容,如果未能解决你的问题,请参考以下文章