如何从磁盘反序列化同一对象时获取对象的现有引用

时间:2017-07-07 21:54:59

标签: c# nunit

对不起该帖的标题,不知道如何表达更好..

我有一个对象unit,我使用MemoryStreamBinaryFormatter将其保存到文件系统。

现在我必须运行NUNIT测试,检查对象carcarloadedFromDisk是否相等。此测试失败,因为它看起来在堆上有不同的引用。

是否可以让反序列化的对象carloadedFromDisk指向对象车的现有引用? 我该怎么做才能使测试通过?

示例:

var car = new Car("Audi");
var unit = new Unit("GoldSmith", car);

unit.save();
var carloadedFromDisk = Car.get(carId); // deserialized

Assert.AreEqual(unit.Car, carloadedFromDisk); // <-- fails

1 个答案:

答案 0 :(得分:1)

  

是否可以将反序列化的对象carloadedFromDisk添加到   指向对象车的现有参考?

这是不可能的。在反序列化期间创建新实例。即使您可以通过反序列化器传递现有实例,但最终会使用单个car实例与自身相比(总是为真)。

  

现在我必须运行一个NUNIT测试,检查两个对象是否同时运行   carloadedFromDisk是平等的。此测试失败,因为它看起来像   他们在堆上有不同的引用。

您应该比较值,而不是比较引用。在Equals类中实施GetHashCodeCar方法,以便Car个实例的字段用于比较和哈希生成。 Equals将通过Assert.AreEqual断言调用Car。例如。如果您的public int Id { get; set; } public string Name { get; set; } public override bool Equals(object obj) { if (obj == null || GetType() != obj.GetType()) return false; Car other = (Car)obj; return (Id == other.Id) && (Name == other.Name); } public override int GetHashCode() { unchecked { int hash = 19; hash = hash * 23 + Id; hash = hash * 23 + Name == null ? 0 : Name.GetHashCode(); return hash; } } 有两个属性:

    function is_box_black_corner(x,y,width,heigth){
    var counter=0;
    for (var i=x; i<(x+width); i++){
        for (var j=y; j<(y+heigth); j++){
            if(my_isblack(i,j)==1){
                counter++;
            }
        }
    }

进一步阅读:Implementing the Equals Method