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

同程序集相同类型System.InvalidCastException异常排查与解决

异常原因分析

这个异常的核心问题出在缓存读取时的类型转换方式错误:

  • 存缓存时直接存入的是UserResponseBody强类型对象,但读取时先以object类型取出再强制转换为UserResponseBody。
  • 若缓存管理器内部使用序列化/反序列化机制(如JSON、二进制序列化),反序列化object类型时,返回的对象可能是序列化框架生成的动态类型,或是未正确绑定到原始UserResponseBody的实例——哪怕类型名、程序完全一致,CLR也会认定这是两个不同类型,强制转换就会失败。

另外,也有可能是缓存中残留了旧的序列化数据,这些数据是用不同配置或旧版本类型序列化的,读取时无法正确映射到当前类型。

解决方案

1. 直接读取强类型缓存

修改GetUserByCatch方法,直接获取UserResponseBody类型,避免强制转换:

public UserResponseBody GetUserByCatch(string cacheId)
{
    return CacheManager.Get<UserResponseBody>(cacheId);
}

让缓存管理器直接将反序列化结果绑定到目标类型,从根源上消除类型不匹配问题。

2. 统一缓存序列化配置

  • 确保缓存的存储与读取使用同一种序列化方式:比如存的时候用Newtonsoft.Json,读取时也要用相同的序列化器和配置(如契约规则、忽略属性等)。
  • 如果使用二进制序列化,给UserResponseBody类型标记[Serializable]特性:
[Serializable]
public class UserResponseBody
{
    // 你的属性定义
}

3. 清空现有缓存

删除当前缓存中的旧数据,避免残留的错误序列化对象继续引发问题。可以手动清理缓存存储,或通过代码调用缓存管理器的清空方法。

4. 检查缓存对象的纯净度

确保AddCacheUser方法存入的是纯净的UserResponseBody对象,没有被代理(如EF Core动态代理)或包装:

  • 可以通过responseBody.GetType().FullName验证RestSharp返回的是否为原始类型,而非代理对象。
  • 如果存在代理,存入缓存前可手动映射为原始类型,或关闭代理生成。

内容的提问来源于stack exchange,提问作者Berk KARASU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:42:51