В моем веб-приложении ASP.NET MVC я использую встроенный метод Controller.Json()
для сериализации объекта и отправки его обратно клиенту в ответ на вызов AJAX. Класс сериализуемого объекта наследуется от другого класса с некоторыми именами общих свойств. Это преднамеренно, так как мне нужны имена свойств, чтобы они соответствовали некоторому отражению, которое происходит. Я «затеняю» те свойства в производном классе, чтобы они могли быть другого типа от их одноименного аналога в базовом классе. Вот упрощенный пример:Как получить только теневое свойство, а не базовое свойство, чтобы получить JSON-сериализацию?
public class BaseModel
{
public string Title { get; set; }
public decimal CleanUpHours { get; set; }
public decimal InstallHours { get; set; }
}
public class DerivedModel : BaseModel
{
public new BucketHoursWithCalculations CleanUpHours { get; set; }
public new BucketHoursWithCalculations InstallHours { get; set; }
}
Когда я сериализовать экземпляр DerivedModel
, мой JSON объект на клиенте содержит только decimal
версии CleanUpHours
и InstallHours
, а не мой собственный класс BucketHoursWithCalculations
.
Проверка объекта в Visual Studio до его сериализации показывает как базовую, , но принцип тот же):
Вот что этот объект выглядит как на стороне клиента, как только это сериализовать в формате JSON:
Как вы можете видеть, производные/тенированные свойства не были сериализованы, а базовые свойства были, но только в тех случаях, когда был конфликт имен (например, свойство Title
в базовой модели сериализовалось просто отлично).
Как я могу сериализовать только тенированные свойства, где есть конфликт имен? Я не считаю, что изменение модификаторов доступа (то есть от public
до protected
или что-то) в базовых свойствах будет работать в моем случае, потому что BaseModel
используется Entity Framework и должен иметь общедоступные свойства. Любая помощь будет оценена по достоинству.
Как украсить ненужные свойства атрибутом '' '[NonSerialized()]' ''? – uncoder
@uncoder К сожалению, этот атрибут не работает в унаследованных классах, где живут нежелательные свойства –
Вы не скрываете свойства, вы их скрываете. У вас есть два полностью отдельных экземпляра переменной с именем CleanUpHours и InstallHours. Согласно JSON, который основан исключительно на строках, которые следует сериализовать где? У вас не должно быть двух разных типов объектов с тем же именем. – Dispersia