Propriedade de serialização JavascriptSerializer duas vezes quando "novo" usado na subclasse
Tentando criar um serviço para retornar um objeto que possui muitas propriedades compartilhadas, mas uma propriedade deve ser altamente limitada em algumas situações. Isso está resultando em comportamento estranho e indesejado, em que um nome de propriedade é reutilizado na saída serializada, resultando em comportamento incorreto no navegador. Aqui está um exemplo que pode ser colado no LINQPad (se você adicionar uma referência aSystem.Web.Extensions
) para ver o problema:
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"; } }
}
Isso imprime:
{"Stuff":"Common things","Status":{"Text":"Loads and loads and loads of things"}}
{"Status":{"Text":"A few things"},"Stuff":"Common things","Status":null}
Quando JSON.parse é chamado no navegador, o segundo Status substitui o primeiro, significando que Status é sempre nulo.
A única maneira de corrigir isso é refatorar para que FullStatus e LimitedStatus herdem de um pai comum e usemoverride
ao invés dissonew
- um pouco mais complicado no código do mundo real, mas possível. Minha suposição está correta? E também, eu estaria interessado em saber se esse é um comportamento esperado ou um bug.