Kotlin密封类Jackson反序列化内存引用不一致问题咨询
Kotlin密封类单例对象反序列化内存引用差异的原因与解决方法
核心原因
Spring Boot注入的ObjectMapper和你自定义的TestObjectMapper的差异,根源在于是否配置了Jackson的Kotlin专用模块:
- Spring Boot通过
JacksonAutoConfiguration自动为ObjectMapper注册了KotlinModule,这个模块对Kotlin的单例object类型做了特殊处理——反序列化时直接返回JVM中已存在的单例实例,所以内存引用和原对象完全一致。 - 你自定义的
TestObjectMapper没有加载这个模块,Jackson会把Kotlin单例object当作普通类处理,反序列化时通过反射创建新的实例,自然会出现内存引用不同的情况。
细节补充
Kotlin的object是语言层面的单例,JVM中只会存在一个实例。但Jackson默认的序列化/反序列化逻辑不识别这种Kotlin专属特性,它会忽略object的单例约束,通过反射绕过私有构造器创建新实例,这就是你看到resultTest有新内存地址的原因。
而KotlinModule中的KotlinObjectDeserializer专门处理这种场景:反序列化时会直接调用object编译后生成的INSTANCE字段,返回已有的单例实例,保证引用一致。
解决方法
给自定义的TestObjectMapper注册KotlinModule即可,修改后的代码如下:
class TestObjectMapper : ObjectMapper() { init { // 注册Kotlin模块,启用Kotlin类型专属处理逻辑 registerModule(KotlinModule()) } }
修改后再运行测试,resultTest的内存引用会和原SealedObject完全一致,测试断言就能通过。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

