爲什麼通過序列化比較兩個對象並比較兩個對象並不是一種好的做法,然後比較下面示例中的字符串?使用序列化比較兩個對象C#
public class Obj
{
public int Prop1 { get; set; }
public string Prop2 { get; set; }
}
public class Comparator<T> : IEqualityComparer<T>
{
public bool Equals(T x, T y)
{
return JsonConvert.SerializeObject(x) == JsonConvert.SerializeObject(y);
}
public int GetHashCode(T obj)
{
return JsonConvert.SerializeObject(obj).GetHashCode();
}
}
Obj o1 = new Obj { Prop1 = 1, Prop2 = "1" };
Obj o2 = new Obj { Prop1 = 1, Prop2 = "2" };
bool result = new Comparator<Obj>().Equals(o1, o2);
我已經測試它和它的作品,它是通用的,所以它可以代表對象的差異很大,但我所問的是這是這種方法比較對象的缺點?
我看到它在this question中被提出,它收到了一些upvotes,但我不明白爲什麼這不被認爲是最好的方式,如果有人想比較兩個對象的屬性的值?
編輯:我嚴格談論Json序列化,而不是XML。
我在問這個,因爲我想爲單元測試項目創建一個簡單通用的Comparator
,所以比較的性能並沒有打擾我,因爲我知道這可能是最大的不利因素之一。另外,無類型的問題可以使用Newtonsoft.Json的TypeNameHandling
屬性設置爲All
。
由於您已經在使用Json.NET,因此它提供了一個API方法['JToken.DeepEquals()'](http://www.newtonsoft.com/json/help/html/DeepEquals.htm)序列化的對象。 – dbc
您需要使用新的散列函數替換'return obj.GetHashCode()',默認的散列函數使用與Equals相同的邏輯,因爲您已經改變了散列現在不正確的equals行爲,因爲許多進程在檢查if後是否只調用Equals散列是相等的,你可能會得到非常奇怪的結果,因爲它代表 – MikeT