Por que o Json.NET não inclui $ type para o objeto raiz quando TypeNameHandling é Auto?
Quando defino o Json.NET para serializar com TypeNameHandling definido como TypeNameHandling.Auto, ele define corretamente $ type para as propriedades filho de um objeto, mas não o faz para o objeto raiz que está sendo serializado. Por quê?
Considere o seguinte repro:
public class Animal
{
public Animal[] Offspring { get; set; }
}
public class Dog : Animal {}
Animal fido = new Dog
{
Offspring = new Animal[] { new Dog() }
};
var json = JsonConvert.SerializeObject(fido,
new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
O Json emitido nojson
variável é:
{
"Offspring": [{
"$type": "MyApp.Dog, MyApp",
"Offspring": null
}]
}
O Json.NETDocumentação diz que paraTypeNameHandling.Auto
o comportamento é:
Inclua o nome do tipo .NET quando o tipo do objeto que está sendo serializado não for o mesmo que o tipo declarado.
Minha pergunta é - Por que o fido não tem"$type": "MyApp.Dog, MyApp",
como seu filhote? :)
ATUALIZAR: Eu descobri a partir da resposta aceita paraessa questão que posso forçar a adição de $ type, fazendo o seguinte:
var json = JsonConvert.SerializeObject(fido,
typeof(Animal),
new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
Formatting = Formatting.Indented
});
Mas minha pergunta ainda se mantém: por que o Json.NET não faz isso sozinho, de acordo com a documentação?