Я использую 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, потому что у него очень похожие графические объекты, работающие как ожидалось в том же проекте.
Единственное, что я могу придумать, это то, что я использую фабричные объекты и вместо того, чтобы сначала создавать каждый уникальный автопроизводитель, а затем создавать экземпляры CarFromManufacturer, проходящие в CarManufacturer ... Я создаю новый экземпляр CarManufacturer. Это объясняет, почему объекты не равны, но именно поэтому я реализовал IEquatable и переопределяет base.Equals (object) и base.GetHashCode().
Я посмотрел в source for DefaultReferenceResolver и использует default constructor of BidirectionalDictionary, который использует EqualityComparer.Default, который с MSDN documentation, использует реализацию Т по IEquatable, если она существует, или иным образом использует base.Equals T в реализации() .... все это привело бы меня к тому, что IEquatable в CarManufacturer должен решить мою проблему. Однако размещение точек останова в CarManufacturer.Equals() и GethashCode() никогда не удавалось ..
Причина, почему я создаю новый экземпляр производителя каждый раз, потому что мой завод объект принимает в EF субъекта объединения записи таблицы (присоединяется автомобиль и производитель) .. поэтому он строит автомобиль у объекта EF Car и обращается к изготовителю с производителем EF. – diegohb
Похоже, что ссылки на объекты сравниваются для равенства. Что случилось с внедрением «IReferenceResolver»? –
Спасибо за мысль!Недостаточно ли переопределения Equals и GetHashCode, чтобы позволить JSON.NET DefaultReferenceResolver знать, как сравнивать объекты? С реализацией IReferenceResolver ничего не происходит, за исключением того, что мне не нужна эта дополнительная сложность, если бы не эта проблема. Я бы предпочел перестроить заводский код, прежде чем делать это. Но вопрос в том, как DefaultReferenceResolver сравнивает равенство. Я обновляю сообщение. – diegohb