【发布时间】:2018-08-03 09:06:56
【问题描述】:
我在使用 Newtonsoft.Json SerializeObject 方法时遇到了错误。在here 之前有人问过这个问题,但与 Newtonsoft 合作的人没有回答为什么会发生这种情况。
基本上,当像这样调用SerializeObject 时:
string json = Newtonsoft.Json.JsonConvert.SerializeObject(from, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All });
我在我的类中覆盖了很多 Equals 方法中的错误:
public override bool Equals(object obj)
{
if (obj == null)
return false;
CapacityConfiguration cc = (CapacityConfiguration)obj; // <-- TypeCastException here; other Properties of the same class are sent in as parameter!
}
当然,我意识到通过这样的检查“很容易”修复:
public override bool Equals(object obj)
{
if (obj is CapacityConfiguration == false)
return false;
CapacityConfiguration cc = (CapacityConfiguration)obj;
}
但真正的问题是:
为什么 Json.Net 在类的 Equals 方法中发送其他类型的对象? 更具体地说,Json.Net 似乎在类中发送了很多其他属性,而不是另一个同一类型的对象。
对我来说,这完全是奇怪的。任何意见将不胜感激。
根据 Visual Studio,我使用的是“版本 8.0.0.0”。
更新 1
很容易测试,因为它是可重现的:
public class JsonTestClass
{
public string Name { get; set; }
public List<int> MyIntList { get; set; }
public override bool Equals(object obj)
{
if (obj == null)
return false;
JsonTestClass jtc = (JsonTestClass)obj;
return true;
}
}
然后只需将此代码放在 Program.cs 或其他任何地方:
JsonTestClass c = new JsonTestClass();
c.Name = "test";
c.MyIntList = new List<int>();
c.MyIntList.Add(1);
string json = Newtonsoft.Json.JsonConvert.SerializeObject(c, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All });
你会得到 TypeCast 异常:
【问题讨论】:
-
有机会提供minimal reproducible example吗?
-
这只是为了检测对象图中可能的循环吗?
-
@LasseVågsætherKarlsen 好吧,我没有准备好,没有。当我在我的大型项目中转换一些数据时,我正在运行它,所以我没有制作一个测试项目。我想也许它可能是众所周知的事情,有人可以解释,但我会整理一个测试,看看我是否可以在那里复制它。
-
无论如何,可能的原因可能是 json.net 正在查看您是否正在序列化循环对象(直接引用自身的对象)。你的
Equals(object)方法应该准备好处理任何类型,所以不管 json.net 是什么,这就是这样做的方法。 -
我已经用上面的“UPDATE 1”更新了我的问题,很容易重现。 @LasseVågsætherKarlsen 这是猜测还是您知道这是事实?因为我最初的想法是有一个严重的错误......?
标签: c# json json.net equals serialization