我的情况是 -
对象是复杂的,因此无法比较每个属性的相等性。
请注意, - WPF模型对象不实现任何与等式相关的接口。
Var model = new TestViewModel();
XmlSerializer s = new XmlSerializer(typeOf(TestViewModel));
var xml = x.Serialize(model);
// Store xml in file
// some more code stuff
// some more code stuff
// some more code stuff
var newModel = x.Deserialize(xml);
If(model.Equals(newModel))
{
// Do some stuff
}
else
{
// do some other stuff
}
答案 0 :(得分:3)
反序列化对象后,它有一个新的引用,所以即使所有属性都相同,这种情况下的比较也是通过引用进行的,这就是你得到错误的原因。您可以执行以下操作之一:
override Equals and GetHashCode并执行您的自定义逻辑,了解何时应将具有不同引用的2个对象视为相等。
根据您的使用情况实施IEquatable或IEqualityComparer
我不了解您的情况,但我认为解决您的问题解决方案最直接的方法1。
所以基本上你会做类似的事情(灵感来自MSDN):
class SerializingClass
{
public readonly Complex1 a;
public readonly Complex2 b;
public readonly Complex3 c;
public override bool Equals(System.Object obj)
{
if (obj == null || GetType() != obj.GetType())
return false;
SerializingClass p = obj as SerializingClass;
// Return true if the fields match:
return a.Id == p.A.Id && b.Id == p.B.Id && c.Id == p.C.Id;
}
public override int GetHashCode()
{
return a.Id ^ b.Id ^ c.Id;
}
}
答案 1 :(得分:1)
ObjectsCompare框架可能很有用
它将允许您避免实现Equals和GetHashCode。
var comparer = new Comparer<TestViewModel>();
If(comparer.Compare(model, newModel))
{
// Do some stuff
}
else
{
// do some other stuff
}