Der JSON-Source-Generator ist ein wichtiges Instrument für die Leistungsoptimierung in .NET 8.0 und höheren Versionen. In der vorherigen Teil der Serie wurde bereits auf die neuen Möglichkeiten des JSON-Source-Generators verwiesen, die es ermöglichen, den Mapping von JSON auf .NET-Objekte bereits zur Entwicklungszeit zu definieren. In diesem Artikel werden weitere Details zum JSON-Source-Generator geliefert, um die Leistungsoptimierung in .NET-Anwendungen zu verbessern.
Neue Funktionen des JSON-Source-Generators in .NET 8.0
——————————————————-
In .NET 8.0 gibt es eine neue Option, um den JSON-Source-Generator zu verwenden, wenn die Laufzeitcodegenerierung im JSON-Serializer abgeschaltet ist. Wenn man jedoch dennoch eine Serialisierung ohne Source Generator versucht (z.B. `JsonSerializer.Serialize(new { value = 42 });`), wird ein Fehlermeldung ausgestoßen: “Reflection-based serialization has been disabled for this application. Either use the source generator APIs or explicitly configure the ‘JsonSerializerOptions.TypeInfoResolver’ property.”
Dies bedeutet, dass man eine von `JsonSerializerContext` abgeleitete Klasse erstellen muss, die per Annotation `[JsonSerializable]` die Verweise auf die zu (de)serialisierenden .NET-Klassen erhält. Optional kann man die Einstellung per `[JsonSourceGenerationOptions]` vornehmen.
Wenn man das Serialisieren ohne Source Generator versucht, wird der folgende Code ausgestoßen:
“`csharp
using System.Text.Json;
public class Person
{
public int value { get; set; }
}
class Consultant : Person
{
public string Name { get; set; }
}
JsonSerializerOptions options = new JsonSerializerOptions();
options.TypeInfoResolver = new TypeInfoResolver(typeof(Consultant));
var serialized = JsonSerializer.Serialize(new Consultant { Name = “John Doe” }, options);
“`
In diesem Beispiel wird die Klasse `Consultant` als Basisklasse für die Klasse `Person` definiert. Wenn man jedoch das Serialisieren ohne Source Generator versucht, wird der folgende Fehler ausgestoßen:
“`csharp
ObjectReference: Object reference not set to an instance of an object.
“`
Dieser Fehler occurs because the source generator is not used to generate the mapping code for the `Consultant` class. If you want to use the source generator, you must create a `JsonSerializerContext` instance and pass it to the `JsonSerializer.Serialize` method:
“`csharp
using System.Text.Json;
public class Person
{
public int value { get; set; }
}
class Consultant : Person
{
public string Name { get; set; }
}
JsonSerializerOptions options = new JsonSerializerOptions();
options.TypeInfoResolver = new TypeInfoResolver(typeof(Consultant));
var serialized = JsonSerializer.Serialize(new Consultant { Name = “John Doe” }, options, new JsonSerializerContext());
“`
In diesem Beispiel wird die Klasse `Consultant` als Basisklasse für die Klasse `Person` definiert und der JSON-Serializer verwendet, um das Objekt `Consultant` zu serialisieren. Ohne den JSON-Source-Generator wird der Fehler “Object reference not set to an instance of an object” ausgestoßen.
Was ist der JSON-Source-Generator und warum ist er wichtig?
———————————————————
Der JSON-Source-Generator ist eine Funktion in System.Text.Json, die es ermöglicht, den Mapping von JSON auf .NET-Objekte bereits zur Entwicklungszeit zu definieren. This is useful for performance optimization and for avoiding runtime code generation.
The JSON-Source-Generator is important because it allows you to define the mapping of JSON to .NET objects at design time, rather than at runtime. This can improve performance by avoiding the need for runtime code generation. Additionally, the JSON-Source-Generator provides a way to generate the mapping code for your .NET objects automatically, without the need for manual mapping.
Wie kann man den JSON-Source-Generator verwenden?
————————————————–
Um den JSON-Source-Generator zu verwenden, muss man eine von `JsonSerializerContext` abgeleitete Klasse erstellen und diese in die `JsonSerializerOptions` instance passing. Additionally, man must the `TypeInfoResolver` property of the `JsonSerializerOptions` instance setzen, um den Mapping von JSON auf .NET-Objekte zu definieren.
Here is an example of how to use the JSON-Source-Generator:
“`csharp
using System.Text.Json;
public class Person
{
public int value { get; set; }
}
class Consultant : Person
{
public string Name { get; set; }
}
JsonSerializerOptions options = new JsonSerializerOptions();
options.TypeInfoResolver = new TypeInfoResolver(typeof(Consultant));
var serialized = JsonSerializer.Serialize(new Consultant { Name = “John Doe” }, options);
“`
In diesem Beispiel wird die Klasse `Consultant` als Basisklasse für die Klasse `Person` definiert und der JSON-Serializer verwendet, um das Objekt `Consultant` zu serialisieren. Ohne den JSON-Source-Generator wird der Fehler “Object reference not set to an instance of an object” ausgestoßen.
Conclusion
———-
Der JSON-Source-Generator ist ein wichtiges Instrument für die Leistungsoptimierung in .NET-Anwendungen. Er ermöglicht die Definition des Mappings von JSON auf .NET-Objekte bereits zur Entwicklungszeit und hilft dabei, den Fehler “Object reference not set to an instance of an object” zu vermeiden. Ohne den JSON-Source-Generator wird die Serialisierung von Objekten ohne Quellenerkennung nicht funktionieren.