Dapatkah Newtonsoft benar-benar menghilangkan daftar Objek Warisan atau Subclass? [duplikat]
Menggunakan Newtonsoft (with TypeNameHandling.All
), jika saya membuat serial List<Animal>
yang menyertakan a <Cat>
dan a <Dog>
, ketika saya men-deserialisasi string kembali menjadi a List<Animal>
, mereka kehilangan warisannya dan menjadi adil <Animals>
.
Apakah ada cara untuk Newtonsoft untuk mempertahankan subclass saat mereka mendapatkan deserialisasi kembali ke List
kelas induknya?
Berikut objeknya:
public class Zoo
{
public List<Animal> Animals;
public Zoo()
{
Animals = new List<Animal>();
}
}
public class Animal
{
}
public class Dog : Animal
{
}
public class Cat : Animal
{
}
}
Berikut tesnya:
static void Main(string[] args)
{
var zoo = new Zoo();
var dog = new Dog();
var cat = new Cat();
zoo.Animals.Add(dog);
zoo.Animals.Add(cat);
var json = JsonConvert.SerializeObject(zoo, Formatting.None,
new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
var newZoo = JsonConvert.DeserializeObject<Zoo>(json);
}
Berikut adalah tampilan daftar Zoo.Animal asli (perhatikan jenis Anjing dan Kucing):

Sekarang, setelah serialisasi, kita dapat melihat subclass disertakan dengan benar. Harus cukup informasi untuk deserialisasi kembali menjadi objek serupa:
{
"$type": "Sample.Sandbox.Zoo, Sample.Sandbox", "Animals": { "$type": "System.Collections.Generic.List`1[[Sample.Sandbox.Animal, Sample.Sandbox]], System.Private.CoreLib",
"$values": [ { "$type": "Sample.Sandbox.Dog, Sample.Sandbox"
},
{
"$type": "Sample.Sandbox.Cat, Sample.Sandbox"
}
]
}
}
Tapi ketika itu menjadi deserialized, Dog
dan Cat
hilang. Mereka Animals
sekarang:

Apakah ada cara untuk Newtonsoft untuk melakukan Deserialisasi JSON dengan benar dan memelihara tipe subclass?
Terima kasih banyak atas tip apa pun.
Jawaban
Anda perlu menambahkan pengaturan pada serialiser dan deserialiser.
coba ini:
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
var json = JsonConvert.SerializeObject(zoo,settings);
var newZoo = JsonConvert.DeserializeObject<Zoo>(json,settings);
foreach (var currentAnimal in newZoo.Animals)
{
Console.WriteLine(currentAnimal.GetType().Name);
}
Harus mencetak: Dog Cat