IRedisDatabase.ListAddToLeft存储实体出现序列化乱码如何解决
Redis存储实体乱码修复方案
问题根因
你当前使用的Redis封装方法默认使用二进制序列化机制处理传入的泛型对象,序列化后的字节数组头部会包含类型元数据、二进制标识等非文本内容,因此存入Redis后会出现乱码,仅后半段可见部分JSON结构,不符合你预期的纯JSON存储要求。
修复方案
你可以根据自己的需求选择以下任意一种方案:
方案1:仅修改当前业务代码,手动序列化对象
在调用Redis存储方法前,先把mailQueue实体序列化为JSON字符串再传入即可,无需修改底层封装代码。示例如下(两种常用序列化库二选一):// 业务逻辑代码 ... _dbContext.MailQueue.Add(mailQueue); _dbContext.SaveChanges(); // 用System.Text.Json序列化 string mailQueueJson = System.Text.Json.JsonSerializer.Serialize(mailQueue); // 或用Newtonsoft.Json序列化 // string mailQueueJson = Newtonsoft.Json.JsonConvert.SerializeObject(mailQueue); var response = _redisCoreManager.ListAddToLeft(RedisConstants.MAILQUEUE, mailQueueJson);方案2:修改Redis封装方法,统一JSON序列化逻辑
如果你希望所有调用ListAddToLeft的对象都自动存为JSON格式,可以直接修改底层封装方法,内置序列化逻辑,避免每次业务调用都手动处理:public long ListAddToLeft<T>(string key, T value) where T : class { var redisValue = default(long); try { // 新增序列化逻辑 string jsonValue = System.Text.Json.JsonSerializer.Serialize(value); redisValue = redis.ListAddToLeft(this.configParamterKey + key, jsonValue); } catch (Exception ex) { logCoreMan.Error("Redis ListAddToLeft Exception", ex); } return redisValue; }注意:用这个方案后续从Redis取值时,需要统一对取出的字符串做JSON反序列化,才能转回对应实体对象。
方案3:全局配置Redis序列化规则
如果你用的Redis客户端支持全局序列化配置,可以直接在服务初始化时将默认序列化器设置为JSON序列化器,不需要修改任何现有业务代码和封装方法,所有存入Redis的对象都会自动转换为JSON格式。
内容的提问来源于stack exchange,提问作者AliRıza Adıyahşi
相关产品推荐
相关产品推荐

