Closed Jiiiiiin closed 9 months ago
目前解决方案,给对应类创建一个无参数构造器,但是对于字段均没有 setter,也就是说 kryo5 在构造对象的时候,应该使用的是强制反射,那这种序列化方案是否比默认的 java方式好呢?另外总觉得 com.fasterxml.jackson.annotation;
注解的方式是不是更优雅?或者老师能介绍一下针对spring-redis 默认的 jackson方式和其他方式的区别么?
你这个问题是个关于 kryo 的问题,其实和 jetcache 没有关系,kryo 就是需要有反序列化的对象有默认的构造函数。
redis 不适合做通用的 java 反序列化方案,因为 json 字符串里面缺失类型信息,比如如果反射得到你的业务类有个 Object 类型的字段,反序列化时仅仅从 json 中的字符串值根本没有办法知道这是个什么类型的字段。
嗯嗯 老师 您说的是,目前用下来的体验就是无论是jackson还是fastjson涉及到redis序列化的地方,都比较容易产生某种“不确定性”,您这个意思一语道破,其实不确定性的根源是json字符串,我在详细了解一下 kryo吧,也是跟着框架才第一次听说,他是能避免json对 java对象的系列化困扰不?
json不是一个 java 序列化方案,json 字符串里面缺乏类型信息,它无法保证反序列化出来的东西和原来的是一样的(除非是特别简单的对象)。
谢谢指点
全局配置如下:
测试场景:
缓存成功了,但是因为
BaseSecOrgRecordCmplxOdrType
没有无参数构造器(我们认为领域值对象,应该最好使用构造器初始化,所以在之前为使用jetcache的时候,针对原始的 redis缓存,针对构造器反序列化都使用 如下:但是在当前的 BaseSecOrgRecordCmplxOdrType 没有配置 @JsonCreator 的时候,在执行一遍测试用例就报,反序列化异常,直至构造器问题
cause by com.esotericsoftware.kryo.kryo5.KryoException: Class cannot be created (missing no-arg constructor): com.xxx.bizlib.types.secpaging.BaseSecOrgRecordCmplxOdrType
:但是就算加上 :
kryo5 还是报需要一个无参数构造器,这种问题有更好的解决思路吗老师?