将c#对象与后反序列化对象

时间:2016-05-04 06:19:38

标签: c# xml-serialization

我的情况是 -

  1. C#WPF模型对象是Xml序列化并存储在xml文件中。
  2. 稍后一段时间后,阅读xml文件并将对象反序列化为新变量
  3. 将步骤1中的c#对象与步骤2中的c#对象进行比较 在上面的场景中,这些对象相等性返回false。
  4. 对象是复杂的,因此无法比较每个属性的相等性。

    请注意,   - 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
    }
    

2 个答案:

答案 0 :(得分:3)

反序列化对象后,它有一个新的引用,所以即使所有属性都相同,这种情况下的比较也是通过引用进行的,这就是你得到错误的原因。您可以执行以下操作之一:

  1. override Equals and GetHashCode并执行您的自定义逻辑,了解何时应将具有不同引用的2个对象视为相等。

  2. 根据您的使用情况实施IEquatableIEqualityComparer

  3. 我不了解您的情况,但我认为解决您的问题解决方案最直接的方法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
}