Neu in .NET 8.0 [31]: Erweiterte Serialisierung in System.Text.Json 8.0

Die JSON-Bibliothek kann nun auch nicht öffentliche Mitglieder serialisieren und deserialisieren.

In Pocket speichern vorlesen Druckansicht
Neural,Network,3d,Illustration.,Big,Data,And,Cybersecurity.,Data,Stream.

(Bild: Yurchanka Siarhei / Shutterstock.com)

Lesezeit: 1 Min.
Von
  • Dr. Holger Schwichtenberg

In System.Text.Json ermöglichen es die Annotationen [JsonInclude] und [JsonConstructor] seit Version 8.0, die Serialisierung nicht öffentlicher Klassenmitglieder zu erzwingen.

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

Für jedes nicht öffentliche Mitglied, das mit [JsonInclude] annotiert ist, muss im Konstruktor, der mit [JsonConstructor] annotiert ist, ein Parameter vorhanden sein, um den Wert während der Deserialisierung setzen zu können. Ein aussagekräftiges Beispiel dazu zeigt folgendes Listing:

Die Serie zu den Neuerungen in .NET 8.0
public class Person
{
 [JsonConstructor] 
 // ohne Annotation: 'Deserialization of types without a 
 // parameterless constructor, a singular parameterized 
 // constructor, or a parameterized constructor annotated with 
 // 'JsonConstructorAttribute' is not supported. 
 internal Person(int id, string name, string website)
 {
  ID = id;
  Name = name;
  Website = website;
 }
 
 [JsonInclude] 
 // ohne Annotation: 'Each parameter in the deserialization 
 // constructor on type 'FCL_JSON+Person' must bind to an
 // object property or field on deserialization. Each parameter
 // name must match with a property or field on the object. 
 // Fields are only considered when
 // 'JsonSerializerOptions.IncludeFields' is enabled. 
 // The match can be case-insensitive.'
 
 internal int ID { get; }
 
 public string Name { get; set; }
 
 [JsonInclude] 
 // ohne Annotation: 'Each parameter in the deserialization
 // constructor on type 'FCL_JSON+Person' must bind to an object
 // property or field on deserialization. Each parameter name must
 // match with a property or field on the object. Fields are only
 // considered when 'JsonSerializerOptions.IncludeFields' is 
 // enabled. The match can be case-insensitive.'
 private string Website { get; set; }
 
 public override string ToString()
 {
  return $"{this.ID}: {this.Name} ({this.Website})";
 }
}
…
// Serialisierung
var p1 = new PersonWithoutParameterlessConstructor
  (42, Dr. Holger Schwichtenberg", "www.dotnet-doktor.de");
string json4 = JsonSerializer.Serialize(p1); 
Console.WriteLine(json4);
//{ "Name":"Dr. Holger Schwichtenberg","ID":42,"Website":"www.dotnet-doktor.de"}
 
// Deserialisierung
var p2 = 
  JsonSerializer.Deserialize<PersonWithoutParameterlessConstructor>(json4);
Console.WriteLine(p2);
//42: Dr.Holger Schwichtenberg (www.dotnet-doktor.de)

(rme)