Po ustawieniu Json.NET do serializacji z ustawieniem TypeNameHandling na TypeNameHandling.Auto, poprawnie ustawia typ $ dla właściwości podrzędnych obiektu, ale nie robi tego dla obiektu głównego, który jest serializowany. Czemu?
Proszę rozważyć następujące 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
});
JSON emitowane do zmiennej json
jest:
{
"Offspring": [{
"$type": "MyApp.Dog, MyApp",
"Offspring": null
}]
}
Json.NET Documentation mówi, że dla TypeNameHandling.Auto
zachowanie jest:
Podaj nazwę typu .NET, gdy typ obiektu jest t jest serializowany nie jest tym samym, co jego zadeklarowany typ.
Moje pytanie brzmi - dlaczego fido nie ma "$type": "MyApp.Dog, MyApp",
jak jego szczenię? :)
UPDATE: Znalazłem się z przyjętą odpowiedzi this question że mogę zmusić $ typ, który zostanie dodany w ten sposób:
var json = JsonConvert.SerializeObject(fido,
typeof(Animal),
new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
Formatting = Formatting.Indented
});
Ale moje pytanie nadal trzyma - Dlaczego Json.NET nie robi tego samodzielnie, jak w dokumentacji?