首頁 > 軟體

redis反序列化報錯原因分析以及解決方案

2023-03-17 06:06:43

redis反序列化報錯原因分析

問題:Cannot deserialize,無法反序列化

分析:

序列化id’不一致

1、實體類實現了序列化介面後,沒有指定序列化id。

2、讀和寫的class版本不一致,srpingboot jar包版本不一致的兩個class檔案,序列化id不一致。因為我們專案是幾個系統對接,共用的一個redis庫。


實體類屬性不一致

可能存到redis的時候是兩個屬性,但是我們本地業務擴充套件,新增了一些欄位,也是無法完成反序列的。這個時候需要及時清理掉快取庫

解決方案:

  • 指定序列化id
  • 統一jar包版本
  • 清除redis庫

redis序列化轉換型別報錯

Cannot convert value of type 'org.springframework.data.redis.core.convert.MappingRedisConverter' to required type 'org.springframework.data.redis.core.mapping.RedisMappingContext': no matching editors or conversion strategy found

在setValue的序列化方式的時候報錯,原來是用的RedisSerializer.json()方法,但是報錯,

template.setConnectionFactory(factory);
        // key序列化方式
        template.setKeySerializer(RedisSerializer.string());
        // value序列化方式
        template.setValueSerializer(RedisSerializer.json());
        // hash key的序列化方式
        template.setHashKeySerializer(RedisSerializer.string());
        // hash value的序列化方式
        template.setHashValueSerializer(RedisSerializer.json());

改成如下即可解決:

template.setConnectionFactory(factory);
        // key序列化方式
        template.setKeySerializer(RedisSerializer.string());
        // value序列化方式
        template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        // hash key的序列化方式
        template.setHashKeySerializer(RedisSerializer.string());
        // hash value的序列化方式
        template.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));

在Redis中,有多種序列化實現可供選擇。其中,Jackson2JsonRedisSerializer和RedisSerializer.json()都是Redis中的序列化實現。

它們的區別如下:

Jackson2JsonRedisSerializer使用Jackson庫將Java物件序列化為JSON格式的字串,並將其儲存到Redis中。它還可以將從Redis中讀取的JSON字串反序列化為Java物件。

因此,使用Jackson2JsonRedisSerializer可以方便地處理JSON格式的資料,並且對於複雜的Java物件可以進行較好的序列化和反序列化。

但是,它可能會在序列化過程中忽略一些Java物件中的欄位,因此需要進行一些設定才能完全控制序列化過程。

RedisSerializer.json()使用Redis的內建JSON序列化器,將Java物件序列化為JSON格式的字串,並將其儲存到Redis中。它也可以將從Redis中讀取的JSON字串反序列化為Java物件。

與Jackson2JsonRedisSerializer相比,RedisSerializer.json()在序列化過程中會將所有Java物件中的欄位都序列化到Redis中,但在處理複雜Java物件時,可能需要進行一些額外的設定。

因此,選擇哪種序列化方式取決於使用場景和具體需求。如果需要處理複雜的Java物件,並且對序列化和反序列化的精細控制比較關鍵,那麼Jackson2JsonRedisSerializer是一個更好的選擇。

而如果處理的資料較為簡單,或者只需要簡單地將Java物件轉換為JSON格式的字串進行儲存,那麼RedisSerializer.json()可能更適合。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com