同程序集相同类型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
相关产品推荐
相关产品推荐

