gpt4 book ai didi

c# - 使用序列化 C# 比较两个对象

转载 作者:太空狗 更新时间:2023-10-29 18:01:50 30 4
gpt4 key购买 nike

为什么通过序列化两个对象然后比较字符串(如以下示例所示)来比较两个对象不是一个好的做法?

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 来处理无类型问题。

最佳答案

首要问题是效率低下

举个例子,想象一下这个 Equals 函数

public bool Equals(T x, T y)
{
return x.Prop1 == y.Prop1
&& x.Prop2 == y.Prop2
&& x.Prop3 == y.Prop3
&& x.Prop4 == y.Prop4
&& x.Prop5 == y.Prop5
&& x.Prop6 == y.Prop6;
}

如果 prop1 不相同,那么其他 5 个比较永远不需要检查,如果你用 JSON 这样做,你必须将整个对象转换为 JSON 字符串,然后每次都比较字符串,这是在上面序列化本身就是一项昂贵的任务。

那么下一个问题是序列化是为通信而设计的,例如从内存到文件,通过网络等。如果您利用序列化进行比较,您可能会降低正常使用它的能力,即您不能忽略传输不需要的字段,因为忽略它们可能会破坏您的比较器.

具体来说,下一个 JSON 是无类型的,这意味着比任何形状或形式都不相等的值可能会被误认为是相等的,而另一方面,如果它们序列化,则相等的值可能由于格式化而无法比较为相等相同的值,这又是不安全和不稳定的

此技术的唯一优点是程序员只需付出很少的努力即可实现

关于c# - 使用序列化 C# 比较两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38411221/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com