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
- немного сложнее в реальном мире кода, но возможно. Правильно ли мое предположение? А также, мне было бы интересно узнать, является ли это ожидаемым поведением или ошибкой.