You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:27:04