C#-Objekt in JSON in .NET: Geheimnisse der Geschwindigkeit und Leistung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum jeder C#-Entwickler Objekte in JSON serialisieren können sollte

\n\n

Haben Sie sich jemals gefragt, wie oft Ihr Code pro Tag komplexe C#-Objekte in kompakte JSON-Strings verwandelt? Die Arbeit mit Web-APIs, das Speichern von Konfigurationen, die Datenübertragung zwischen Microservices – überall stoßen wir auf Serialisierung. Die Frage "How do I turn a C# object into a JSON string in .NET?" ist eine der beliebtesten auf Stack Overflow, und das nicht ohne Grund. Davon, wie genau Sie dies tun, hängt die Geschwindigkeit Ihrer Anwendung und ihre Reaktionsfähigkeit ab.

\n\n

In diesem Artikel zeigen wir nicht nur, wie man ein Objekt in einen JSON-String umwandelt. Wir analysieren Optimierung und Leistung dieses Prozesses: von der Bibliotheksauswahl bis zur Feinabstimmung des Serialisierers. Sie erfahren, wie Sie typische Fehler vermeiden, die Ihre Anwendung verlangsamen, und lernen, Code zu schreiben, der blitzschnell arbeitet.

\n\n

Die grundlegende Methode: Wie man ein C#-Objekt in einen JSON-String umwandelt

\n\n

Beginnen wir mit der Klassik. Nehmen wir an, wir haben eine einfache Klasse User:

\n\n
public class User\n{\n    public int Id { get; set; }\n    public string Name { get; set; }\n    public string Email { get; set; }\n}
\n\n

Der einfachste Weg, es zu serialisieren, ist die Verwendung von Newtonsoft.Json (auch bekannt als Json.NET):

\n\n
using Newtonsoft.Json;\n\nvar user = new User { Id = 1, Name = "Alexej", Email = "alex@example.com" };\nstring json = JsonConvert.SerializeObject(user);\nConsole.WriteLine(json); \n// {"Id":1,"Name":"Alexej","Email":"alex@example.com"}
\n\n

Mit der Veröffentlichung von .NET Core 3.0 kam das native System.Text.Json – eine schnelle und leichte Alternative:

\n\n
using System.Text.Json;\n\nvar user = new User { Id = 1, Name = "Alexej", Email = "alex@example.com" };\nstring json = JsonSerializer.Serialize(user);\nConsole.WriteLine(json);\n// {"Id":1,"Name":"Alexej","Email":"alex@example.com"}
\n\n

Es scheint keinen Unterschied zu geben. Aber wenn Ihre Anwendung Tausende von Anfragen pro Sekunde verarbeitet, wird die Wahl des Serialisierers entscheidend.

\n\n

Leistung: Newtonsoft.Json vs System.Text.Json

\n\n

Schauen wir uns die Serialisierungsleistung in .NET 8 an. In Tests mit 1 Million Operationen:

\n\n
    \n
  • System.Text.Json – im Durchschnitt 40-60% schneller als Newtonsoft.Json bei der Serialisierung einfacher Objekte.
  • \n
  • Newtonsoft.Json – verliert an Geschwindigkeit, gewinnt aber an Flexibilität: Es unterstützt mehr benutzerdefinierte Konverter und Attribute.
  • \n
  • Speicherverbrauch – System.Text.Json erzeugt weniger Müll, was die Belastung des Garbage Collectors (GC) reduziert.
  • \n
\n\n

Es gibt jedoch eine Einschränkung: Wenn Sie Unterstützung für JsonIgnore, JsonPropertyName oder komplexe Konverter benötigen, ist Newtonsoft.Json nach wie vor unverzichtbar. Für die meisten modernen Projekte auf .NET 6+ wird jedoch die Verwendung von System.Text.Json empfohlen.

\n\n

Optimierung der Serialisierung: 5 praktische Tipps

\n\n

Kommen wir nun zum Interessantesten – wie Sie Ihren Code noch schneller machen können.

\n\n

1. Verwenden Sie Source Generators

\n\n

System.Text.Json unterstützt Source Generation – die Kompilierung des Serialisierungscodes zur Build-Zeit anstatt zur Laufzeit. Ergebnis: eine Beschleunigung um das 2- bis 3-fache!

\n\n
[JsonSerializable(typeof(User))]\npublic partial class UserContext : JsonSerializerContext\n{\n}\n\n// Verwendung:\nstring json = JsonSerializer.Serialize(user, UserContext.Default.User);
\n\n

Dieser Ansatz ist besonders effektiv für große Modelle und Anwendungen mit hoher Auslastung.

\n\n

2. Passen Sie den Serialisierer an Ihre Aufgaben an

\n\n

Verwenden Sie nicht die Standardeinstellungen. Deaktivieren Sie unnötige Optionen:

\n\n
var options = new JsonSerializerOptions\n{\n    PropertyNamingPolicy = JsonNami                

Blogs

Buchempfehlungen