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

DeSerialization 使用Serializable 接口机制使用Reflectiondeserialize 对象字节到对象。但默认no arg constructor 在此过程中不会被调用,因此不需要它。但是像Spring,Hibernate 等所有框架都需要no arg constructor,即使它们使用反射。这不是矛盾还是我遗漏了什么?

【问题讨论】:

    标签: java spring hibernate serialization serializable


    【解决方案1】:

    内置标准反序列化不使用标准反射来创建实例。

    标准反射不能在不调用构造函数(不一定是无参数构造函数)的情况下创建实例。所以任何只使用标准反射的框架都需要调用构造函数来创建实例。

    要在不调用构造函数的情况下创建实例,您需要某种特定于 jvm-vendor 的扩展,例如 Unsafe。使用这些扩展由框架开发人员决定,许多人决定反对。 (XStream https://x-stream.github.io/faq.html 是我唯一知道实际使用它的)

    【讨论】:

    • 另一方面,超类无参数构造函数被调用......你确认了吗?
    • 所有构造函数(java.lang.Object 除外)将调用另一个构造函数(超类或同一类中的一个)
    • @CodeScale 不确定“另一方面”是什么意思。标准序列化不调用任何构造函数,实例刚刚存在。
    • 只在反序列化过程中说话..不是在正常使用对象创建过程中
    • @ghostrider 不确定到底使用了什么。它是一个 jvm 内置功能。所以它可以使用任何东西。但它不能只使用标准反射,因为它不能提供足够的功能。
    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2017-08-30
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多