JavascriptSerializer сериализует свойство дважды, когда «новый» используется в подклассе

Попытка создать службу для возврата объекта, который имеет много общих свойств, но в некоторых ситуациях одно свойство должно быть сильно ограничено. Это приводит к странному и нежелательному поведению, когда имя свойства повторно используется в сериализованном выводе, что приводит к некорректному поведению в браузере. Вот пример, который можно вставить в LINQPad (если вы добавите ссылку наSystem.Web.Extensions) чтобы увидеть проблему:

void Main()
{
    System.Web.Script.Serialization.JavaScriptSerializer json = new System.Web.Script.Serialization.JavaScriptSerializer();

    json.Serialize(new Full(true)).Dump();
    json.Serialize(new Limited()).Dump();
}

public class Full
{
    public String Stuff { get { return "Common things"; }  }
    public FullStatus Status { get; set; }

    public Full(bool includestatus)
    {
        if(includestatus)
            Status = new FullStatus();
    }
}

public class Limited : Full
{
    public new LimitedStatus Status { get; set; }

    public Limited() : base(false)
    {
        Status = new LimitedStatus();
    }
}

public class FullStatus 
{
    public String Text { get { return "Loads and loads and loads of things"; } }
}

public class LimitedStatus 
{
    public String Text { get { return "A few things"; } }
}

Это печатает:

{"Stuff":"Common things","Status":{"Text":"Loads and loads and loads of things"}}
{"Status":{"Text":"A few things"},"Stuff":"Common things","Status":null}

Когда в браузере вызывается JSON.parse, второе состояние переопределяет первое, что означает, что статус всегда равен нулю.

Единственный способ исправить это - это реорганизовать так, чтобы FullStatus и LimitedStatus оба наследовали от общего родителя и использовалиoverride скорееnew - немного сложнее в реальном мире кода, но возможно. Правильно ли мое предположение? А также, мне было бы интересно узнать, является ли это ожидаемым поведением или ошибкой.

Ответы на вопрос(1)

Ваш ответ на вопрос