如何深入比较不可序列化的对象?

时间:2015-04-28 10:52:01

标签: c# .net wpf serialization

假设我们有两个光标文件,它们被加载到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'未标记为可序列化。

比较这些对象的方法是什么?

1 个答案:

答案 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);