2016-05-04 3 views
-3

У меня есть сценарий, где -Сравнить с # объект с пост десериализованное объекта

  1. A C# WPF объектная модель является Xml Serialized и хранится в XML-файле.
  2. Позже после того, как какой-то момент времени, прочитать файл XML и десериализации объекта в новую переменную
  3. Сравнить C# объекта на шаге 1 с C# объекта на шаге 2 В приведенном выше сценарии, это объект равенства возвращает ложь.

Объект является сложным и, следовательно, не может сравнивать каждое свойство для равенства.

Примечание, - Объект модели 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 
} 
+3

У вас есть код? Как вы сравниваете эти два объекта? Использует ли ваш класс какой-либо интерфейс для обеспечения равенства? IEquatable? – user3185569

+1

Пожалуйста, включите в свой вопрос более подробную информацию и попытайтесь показать, что вы сделали до сих пор. Вы отметили это [tag: xml], но имеет ли это какое-либо отношение к XML? Если да, и вы хотите сравнить файлы XML, см. ['XNode.DeepEquals()'] (http://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.deepequals.aspx). Или вы просто ищете автоматическое рекурсивное сравнение равенств? Если это так, см., Возможно, [C# реализация глубокого/рекурсивного сравнения объектов в .net 3.5] (http://stackoverflow.com/questions/1539989) – dbc

+0

Добавлен соответствующий код. –

ответ

3

После того, как объект десериализация имеет новую ссылку, так что даже если все свойства совпадают, Comparision в этом случае производится по ссылке, и именно поэтому вы получаете ложными. Вы можете сделать одно из следующих действий:

  1. override Equals and GetHashCode и там выполнять пользовательскую логику о том, когда 2 объекта с разными ссылками следует считать равными.

  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; 
    } 
} 
+0

Было бы лучше, если бы вы добавили образец для хотя бы одного из предложений. Это сделает ответ более полным. – niksofteng

1

ObjectsCompare может быть полезна в этом случае

Это позволит вам избежать реализации Equals и GetHashCode.

var comparer = new Comparer<TestViewModel>(); 
If(comparer.Compare(model, newModel)) 
{ 
     // Do some stuff 
} 
else 
{ 
    // do some other stuff 
}