解释为什么将对象转换为二进制并进行比较失败

时间:2017-06-03 06:11:42

标签: c#

使用我的代码示例为什么前两个对象在转换为二进制文件时不会相互相等?

我知道我可以为equals方法编写一个覆盖,并使用它来检查两个对象是否相似。但是我正在尝试这种方法。为什么两个相同的对象转换为不同的二进制值?

鉴于上课:

[Serializable]
public class HashingSample
{
    public int Number { get; set; }

    public HashingSample(int num)
    {
        Number = num;
    }

    public byte[] ToBinary()
    {
        using (MemoryStream stream = new MemoryStream())
        {
            var binaryFormatter = 
                new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            binaryFormatter.Serialize(stream, this);
            return stream.ToArray();
        }
    }
}

这段代码:

var s1 = new HashingSample(1).ToBinary();
var s1_2 = new HashingSample(1).ToBinary();
var s2 = new HashingSample(2).ToBinary();

var first2 = s1.Equals(s1_2);

3 个答案:

答案 0 :(得分:0)

他们是平等的。它们的byte []长度相同,值相同。

.Equals运算符虽然不这么认为。

这可能是因为s1和s1_2的实际实例不相同(它们是唯一的实例,因此它们的哈希码不会相同..尽管s1具有相同的byte []内容,但s1并不是真正的s1_2。 )

答案 1 :(得分:0)

等于在数组的上下文中没有达到预期效果 - 有关更多详细信息,请参阅https://blogs.msdn.microsoft.com/kathykam/2006/03/08/array-equals/

一般来说,你应该假设 Equals进行引用相等性检查(即检查两个对象是 exact 相同的对象,而不是两个不同的对象发生在其中具有相同的属性/值) - 除非文档明确告诉您。

您可以替换:

var first2 = s1.Equals(s1_2);

使用:

var first2 = StructuralComparisons.StructuralEqualityComparer.Equals(s1, s1_2);

var first2 = s1.SequenceEqual(s1_2);

(或使用我提供的链接中的代码)

答案 2 :(得分:0)

使用扩展程序的可能解决方案

public static class HashingExtensions
{
    public static bool Compare(this object v1, object v2)
    {
        var w1 = v1.ToBinary(); var w2 = v2.ToBinary();
        if (w1.Count() == w2.Count())
        {
            for (int x = 0; x < w1.Count(); x++)
            {
                if (w1[x] != w2[x])
                {
                    return false;
                }
            }
            return true;
        }
        else {
            return false;
        }
    }

    public static Byte[] ToBinary(this object obj)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            binaryFormatter.Serialize(stream, obj);
            return stream.ToArray();

        }
    }
}