Newtonsoft序列化抛出InvalidCastException异常,求解决方案
解决Newtonsoft序列化时的InvalidCastException异常
这个问题我之前处理过,从你的栈跟踪信息来看,根源出在Patient类的Equals方法实现上,结合Newtonsoft的循环引用检查逻辑才触发了这个异常。
问题原因拆解
Newtonsoft在序列化过程中会执行循环引用检查(CheckForCircularReference),这个过程会用到List<T>.Contains()方法,而Contains又会调用你的Patient.Equals(Object obj)方法。如果你的Equals方法直接把obj强制转换为Patient类型,没有先做类型校验,当Newtonsoft传递过来的对象不是Patient类型时(比如序列化时生成的代理对象、或者继承自Patient的子类实例),就会直接抛出InvalidCastException。
具体解决方案
1. 修复Patient类的Equals和GetHashCode方法
这是最根本的解决办法,因为Equals方法的错误实现本身就是代码隐患。正确的实现应该先检查对象类型,再做比较:
public override bool Equals(object obj) { // 先判断是否为null或者类型不匹配 if (obj == null || GetType() != obj.GetType()) return false; // 类型安全的转换 Patient otherPatient = (Patient)obj; // 这里替换成你实际需要比较的属性,比如Id、唯一标识等 return this.Id == otherPatient.Id; } // 必须同时重写GetHashCode,保持Equals和GetHashCode的一致性 public override int GetHashCode() { // 用你在Equals里比较的属性生成哈希值 return Id.GetHashCode(); }
2. 临时规避:关闭循环引用检查(不推荐长期使用)
如果你只是想快速绕过这个问题,可以在序列化时禁用循环引用检查,但这只是治标不治本:
var serializerSettings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; string serializedJson = JsonConvert.SerializeObject(yourDataObject, serializerSettings);
额外提醒
一定要优先修复Equals方法,因为不符合规范的Equals实现不仅会导致序列化问题,还可能在其他集合操作(比如HashSet、Dictionary的键对比)中引发意想不到的错误。
内容的提问来源于stack exchange,提问作者bob.mazzo
相关产品推荐
相关产品推荐

