Serialization 反序列化到另一个类-Spring data redis

Serialization 反序列化到另一个类-Spring data redis,serialization,json-deserialization,spring-data-redis,Serialization,Json Deserialization,Spring Data Redis,在SpringDataRedis上工作我序列化了一个对象并将其存储到Redis中。序列化策略是jackson2json重新序列化器。因此,假设我的bean是Sample.java,带有一些属性prop1,prop2,下面是如何将它添加到缓存中的 \xAC\xED\x00\x05sr\x00'com.main.model.Sample\x90\x91\xFB4\xDD\x9D\xE1\xBB\x02\x00\x11J\x00\x0Bprop1J\x00\x0Aprop2J 正如我们所见,对象类型

在SpringDataRedis上工作我序列化了一个对象并将其存储到Redis中。序列化策略是jackson2json重新序列化器。因此,假设我的bean是
Sample.java
,带有一些属性
prop1,prop2
,下面是如何将它添加到缓存中的

\xAC\xED\x00\x05sr\x00'com.main.model.Sample\x90\x91\xFB4\xDD\x9D\xE1\xBB\x02\x00\x11J\x00\x0Bprop1J\x00\x0Aprop2J
正如我们所见,对象类型info
Sample
也以其完全限定名存储

现在有多个服务通过反序列化和更新该条目并将其写回缓存来处理该条目(各种服务中的模型/bean具有不同的完全限定名称)

当另一个服务尝试反序列化时出现问题,失败的原因是
ClassNotFoundException

    org.springframework.data.redis.serializer.SerializationException:         
       Cannot serialize; nested exception is 
       org.springframework.core.serializer.support.SerializationFailedException: 
       Failed to deserialize object type; 
       nested exception is java.lang.ClassNotFoundException: com.xyz.model.BasicSample
这是一个样本

服务1

    @Override
    @Cacheable(value = "sample", key = "{ #sample.sampleId }", unless = "#result == null")
    public Sample fetchSample(Sample sample) {...}
服务2

    @Override
    @Cacheable(value = "sample", key = "{ #sample.sampleId }", unless = "#result == null")
    public BasicSample fetchBasicSample(BasicSample sample) {...}
有什么办法可以做到这一点吗

  • 停止存储此信息

  • 在反序列化时忽略此选项

  • 反序列化为具有相同属性的不同类对象的方法


我刚刚花了半天时间讨论同一个问题,因此将答案留给子孙后代:

通常,SpringDataRedis将使用完整的类名作为_类键,但开发人员可以使用
@TypeAlias(“someAlias”)
注释对其进行自定义。这将覆盖_class字段

因此,您可以将这两个类定义为:

package com.example.service1;

import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;

@RedisHash(value = "sample")
@TypeAlias("SampleType")
public class Sample {
    @Indexed
    int id;

    String name;
    ...
}
现在,redis对象将独立于类包名称进行反序列化


查看存储在Redis中的示例数据,这看起来不像Jackson序列化,更像是默认的jdk序列化。你能检查一下你的
RedisCacheConfiguration
,它应该有类似于
…serializeValuesWith(SerializationPair.fromsializer(redisializer.json())
@christofstrobl的东西,对!Spring Data Redis使用的默认序列化程序是
Jackson2JSONRedisializer
,它在内部使用jdk序列化。您有要运行的示例吗。Jackson序列化程序直接使用
ObjectMapper.WriteValuesBytes
。因此,Redis中的条目应该是纯JSON,比如
{“@class”:“com.xyz.model.Sample”,“firstame”:“calmity”…
您有代码片段/gist/repo要运行吗?感谢您的努力:)将尝试一下。
package com.example.service2;

import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;

@RedisHash(value = "sample")
@TypeAlias("SampleType")
public class Sample {
    @Indexed
    int id;

    String name;
    ...
}