RedisValue转换为泛型T时'False'/'True'转布尔类型报错如何解决?
问题修复方案
根因分析
- 读取缓存时直接将
RedisValue对象传入Convert.ChangeType方法,StackExchange.Redis的RedisValue内置的IConvertible.ToBoolean实现逻辑会优先尝试将内容转为数值再映射为布尔值,碰到字符串形式的"True"/"False"时无法完成转换,抛出类型转换异常。 - 存入缓存时直接调用
ToString()仅能输出类型的默认字符串表示,仅适配极少数简单类型,无法兼容复杂对象、枚举、可空类型等更多场景的转换需求。
修复方案
方案1:快速修复(仅适配简单值类型、字符串场景)
仅修改Get方法,先取出Redis存储的原始字符串内容再做类型转换:
public T? Get<T>(string key) { T? result = default; var redisValue = _database.StringGet(key); if (redisValue.HasValue) { string rawValue = redisValue.ToString(); result = (T?)Convert.ChangeType(rawValue, typeof(T)); } return result; }
方案2:通用序列化方案(推荐)
改为用JSON做序列化/反序列化处理,可适配所有可序列化类型,完全规避类型转换边界问题:
改造存入方法
public bool AddOrUpdate<T>(string key, T value) { if (value == null) return false; // 序列化为JSON字符串存储 string jsonValue = System.Text.Json.JsonSerializer.Serialize(value); return _database.StringSet(key, jsonValue); }
改造读取方法
public T? Get<T>(string key) { var redisValue = _database.StringGet(key); if (!redisValue.HasValue) return default; // 反序列化JSON为目标类型 return System.Text.Json.JsonSerializer.Deserialize<T>(redisValue.ToString()); }
如果项目用Newtonsoft.Json,替换对应的序列化方法为JsonConvert.SerializeObject和JsonConvert.DeserializeObject<T>即可。
内容的提问来源于stack exchange,提问作者user2650277
相关产品推荐
相关产品推荐

