2017-07-07 83 views
1

對不起,文章的標題反序列化相同對象時獲得一個現有的對象引用,不知道怎麼去表達它更好..如何從磁盤

我有一個對象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

是否有可能有反序列化對象carloadedFromDisk到 指向對象車的現有的參考?

這是不可能的。新實例在反序列化過程中創建。即使你可以通過現有的實例被反序列化器填充,那麼你最終會得到一個與其本身相比(實際爲true)的實例。

現在我必須運行一個NUNIT測試,檢查carloadedFromDisk和 carloadedFromDisk是否相等。此測試失敗,因爲它看起來像 它們在堆上有不同的引用。

而不是比較引用,你應該比較值。在您的Car類中實施EqualsGetHashCode方法,以便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; 
    } 
} 

延伸閱讀:Implementing the Equals Method

+0

爲什麼使用19作爲哈希的初始值,爲什麼你用23乘以散列,意外?感謝您的快速回復! – Legends

+1

@Lemends是素數 - 目的是獲得良好的散列碼分佈,以避免所有項目進入字典或其他散列集合的相同存儲桶。雖然人們說它[更好地使用大素數](https://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode) –