【发布时间】:2016-07-16 12:31:46
【问题描述】:
为什么通过序列化两个对象来比较两个对象,然后像下面的示例那样比较字符串不是一个好习惯?
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 中提出建议,并且收到了一些赞成票,但我不明白为什么这不是最好的方法,如果有人只想比较两个对象的属性值?
编辑:我说的是 Json 序列化,而不是 XML。
我问这个是因为我想为一个单元测试项目创建一个简单而通用的Comparator,所以比较的性能不会让我很困扰,因为我知道这可能是最大的缺点之一.在 Newtonsoft.Json 的情况下,也可以使用 TypeNameHandling 属性设置为 All 来处理无类型问题。
【问题讨论】:
-
由于您已经在使用 Json.NET,它提供了一个 API 方法
JToken.DeepEquals()用于比较两个序列化对象。 -
你需要用一个新的哈希器替换
return obj.GetHashCode(),默认的哈希器使用与Equals相同的逻辑,因为你改变了equals的行为,现在哈希不正确,因为许多进程只在之后调用Equals检查哈希是否相等,您可能会得到非常奇怪的结果
标签: c# json unit-testing serialization comparison