Java中没有arg构造函数和反序列化

Posted

技术标签:

【中文标题】Java中没有arg构造函数和反序列化【英文标题】:No arg constructor and De serialization in Java 【发布时间】:2020-08-05 22:21:56 【问题描述】:

DeSerialization 使用Serializable 接口机制使用Reflectiondeserialize 对象字节到对象。但默认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构造函数和反序列化的主要内容,如果未能解决你的问题,请参考以下文章

Java 序列化和反序列化Serializable 源码分析 - 2

Java中没有arg构造函数和De序列化

状态 400 和反序列化对象列表时出错。未找到默认构造函数

Dubbo中Map类型默认的序列化和反序列化

java中的序列化和反序列化

Protobuf-Net 无法在没有无参数构造函数的情况下反序列化记录