.NET 7.0’daki yenilikler [25]: System.Text.Json ile serileştirme sırasındaki polimorfizm

Womanne

Member
Bu serinin başlarında, serileştirme sırasında polimorfizm kullanılıyordu. System.Text.Json (sürüm 7.0’dan beri) sunuldu. Tip ayırıcı ayrıca seri durumdan çıkarmaya da yardımcı olur – burada da JSON serisini kaldırıcı polimorfik olarak çalışabilir.

Duyuru








Dr Holger Schwichtenberg, güvenlikle ilgili son derece kritik alanlarda bile yenilik ve deneyim odaklı yazılım geliştirme sunan MAXIMAGO’da Baş Teknoloji Uzmanıdır. Aynı zamanda, çok sayıda orta ölçekli ve büyük şirketi yazılım geliştirme ve işletim konusunda 38 tanınmış uzmanla danışmanlık ve eğitimle destekleyen uzman ağı www.IT-Visions.de’nin başkanıdır.







Örnek


Son bölümde olduğu gibi, sınıf Person türetilmeleri ile Consultant verwendet.


[JsonDerivedType(typeof(Person), typeDiscriminator: "P")]
[JsonDerivedType(typeof(Consultant), typeDiscriminator: "C")]
public class Person
{
public required int ID { get; set; }
public required string Name { get; set; }
public override string ToString()
{
return $"Person {Name}";
}
}

public class Consultant : Person
{
public string? Company { get; set; }
public override string ToString()
{
return $"Consultant {Name} arbeitet bei {Company}";
}
}



Eklemeden bir JSON dizesinden $type


var JSONohneTyp = """
{"ID":123,"Company":"www.IT-Visions.de",
"Name":"Holger Schwichtenberg"}
""";



Yalnızca türü açıkça belirtirseniz bir danışman nesnesi oluşturulur. Consultant İLE Deserialize<T>() belirtmek:

Duyuru


Consultant? p1a =
JsonSerializer.Deserialize<Consultant>(JSONohneTyp);
Console.WriteLine(p1a); // Consultant

Person? p1b =
JsonSerializer.Deserialize<Consultant>(JSONohneTyp);
Console.WriteLine(p1b); // Consultant

Person? p1c =
JsonSerializer.Deserialize<Person>(JSONohneTyp);
Console.WriteLine(p1c); // Person



Eğer o $type itibaren


var JSONmitTyp = """"
{"$type":"C","ID":123,
"Company":"www.IT-Visions.de",
"Name":"Holger Schwichtenberg"}
"""";



her üç durumda da a alırsın Consultant-İtiraz etsen bile Deserialize<Person>() çağrılar!


Consultant? p2a =
JsonSerializer.Deserialize<Consultant>(JSONmitTyp);
Console.WriteLine(p2a); // Consultant

Person? p2b =
JsonSerializer.Deserialize<Consultant>(JSONmitTyp);
Console.WriteLine(p2b); // Consultant

Person? p2c =
JsonSerializer.Deserialize<Person>(JSONmitTyp);
// Wegen $type kriegen wir dennoch Consultant statt Person!
Console.WriteLine(p2c);



Kullanılabilirlik


System.Text.Json .NET 7.0 ile birlikte bir NuGet paketi olarak piyasaya sürüldü, ancak aynı zamanda .NET Standard 2.0 altında ve dolayısıyla klasik .NET Framework sürümünde .NET Core 2.x/3.x ve .NET 5.0/.NET 6.0 üzerinde de çalışıyor 4.6.2.


(rm)



Haberin Sonu
 
Üst