我正在使用JSON.NET 6.0.3。我已經改變PreserveReferences選項如下:JSON.NET序列化 - DefaultReferenceResolver如何比較相等性?
HttpConfiguration.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
我的對象圖如下所示:
public class CarFromManufacturer
{
public int CarID { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public CarManufacturer Manufacturer { get; set; }
}
public class CarManufacturer
{
public int ManufacturerID { get; set; }
public string Name { get; set; }
}
我的WebAPI控制器被返回的結果集的IEnumerable [CarFromManufacturer]的。所以結果可能是來自兩個獨特製造商對象的5輛汽車的清單。我期待JSON結果只列出一次完全序列化的每個製造商,然後使用同一個製造商的$ ref ID作爲原始的$ id。這沒有發生。
即使我找不到一篇關於如何爲ReferenceResolver建立平等的文檔,我已經實現了IEquatable以及覆蓋base.Equals和base.GetHashCode(),但沒有運氣。
我想避免實現我自己的IReferenceResolver,因爲在同一個項目中有非常相似的對象圖表按照預期工作。
我能想到的唯一的事情是,我使用的是工廠對象,而不是先創建每個獨特的CarManufacturer,然後創建傳遞CarManufacturer的CarFromManufacturer實例......我正在創建一個CarManufacturer的新實例。這可以解釋爲什麼對象不相等,但這就是爲什麼我實現了IEquatable並重寫base.Equals(object)和base.GetHashCode()。
我看着到source for DefaultReferenceResolver並使用它使用EqualityComparer.Default其中,從MSDN documentation,採用T的執行IEquatable,如果它不存在,或者以其他方式使用T的base.Equals()執行default constructor of BidirectionalDictionary ....所有這一切都會讓我相信CarManufacturer中的IEquatable能夠解決我的問題。然而,在CarManufacturer.Equals()和GethashCode()中放置斷點從未命中..
爲什麼我創建制造商的一個新實例每次都是因爲我的工廠對象發生在連接表記錄的EF實體的原因(加入汽車和製造商)..所以它從EF Car對象構建汽車,並通過EF製造商調用ManufacturerFactory。 – diegohb 2014-08-29 11:59:53
看起來像是比較對象引用的相等性。實施IReferenceResolver有什麼問題? – 2014-08-29 13:40:45
感謝您的意見!重寫Equals和GetHashCode不足以讓JSON.NET的DefaultReferenceResolver知道如何比較對象嗎?實施IReferenceResolver沒什麼問題,除非我不需要額外的複雜性,如果它不是這個問題的話。我寧願在做這件事之前重組工廠代碼。但問題是關於DefaultReferenceResolver如何比較相等性。我正在更新帖子.. – diegohb 2014-08-29 16:21:58