2015-04-28 2 views
3

Допустим, у нас есть два курсора файлы, которые загружаются в C# объекты:Как глубоко сравнивать несериализуемые объекты?

using (var ms = new MemoryStream(Resource.file1)) 
    _cursor1 = new System.Windows.Input.Cursor(ms); 

using (var ms = new MemoryStream(Resource.file2)) 
    _cursor2 = new System.Windows.Input.Cursor(ms); 

Есть причины, я хотел бы сравнить эти объекты (например, предположить, что file1 может быть копией file2 и я как его обнаружить). У меня есть метод, который пытается десериализации объектов в массив байт, для того, чтобы, наконец, сравнить такие массивы:

public static byte[] ToByteArray(this object obj) 
{ 
    var bf = new BinaryFormatter(); 
    using (var ms = new MemoryStream()) 
    { 
     bf.Serialize(ms, obj); 
     return ms.ToArray(); 
    } 
} 

К сожалению, использование кидает ошибки сериализации:

var equal = _cursor1.ToByteArray().SequenceEqual(_cursor2.ToByteArray()); 

Additional information: Type 'System.Windows.Input.Cursor' in Assembly 'PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is not marked as serializable.

Что путь сравнить такие объекты?

+0

Используйте другой сериализатор? – CodesInChaos

+0

@CodesInChaos: Не могли бы вы рассказать? – jwaliszko

ответ

1

Сравнивать потоки памяти намного проще, чтобы проверить, равны они или нет.

Еще больше вы можете выбрать, что вы хотите сравнить, а что нет. Если вы попытаетесь сравнить объекты курсора, возможно, у них есть внутренние данные, которые делают их разными, даже если они имеют одинаковую форму.

Я думаю, что вы знаете, как сравнивать MemoryStreams, иначе просто скажите это.

EDIT: Хорошо. Насколько я вижу, это ваш единственный вариант. После декомпиляции класса курсора почти вся работа выполняется с неуправляемым кодом, поэтому у вас не будет доступа к нему.

[DllImport("user32.dll", BestFitMapping=false, CharSet=CharSet.Auto, EntryPoint="LoadImage", ExactSpelling=false, SetLastError=true, ThrowOnUnmappableChar=true)] 
     internal static extern NativeMethods.CursorHandle LoadImageCursor(IntPtr hinst, string stName, int nType, int cxDesired, int cyDesired, int nFlags); 
+0

Спасибо, но, к сожалению, у меня нет доступа к этим потокам. У меня есть доступ к объектам курсора. – jwaliszko

+0

@JaroslawWaliszko: проверьте мои изменения. –

+0

Я не вижу, насколько релевантный P/Invoke имеет значение? – aevitas

Смежные вопросы