假设我们有两个光标文件,它们被加载到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());
其他信息:键入' System.Windows.Input.Cursor'在大会 ' PresentationCore,版本= 4.0.0.0,文化=中立, 公钥= 31bf3856ad364e35'未标记为可序列化。
比较这些对象的方法是什么?
答案 0 :(得分:1)
比较内存流以检查它们是否相等要容易得多。
您可以选择要比较的内容以及不想要的内容。如果您尝试比较Cursor对象,它们可能具有内部数据,即使它们具有相同的形状也会使它们不同。
我认为你知道如何比较MemoryStreams
,否则就说出来。
编辑:好的。据我所知,这是你唯一的选择。在反编译游标类之后,几乎所有工作都是使用非托管代码完成的,因此您无法访问它。
[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);