1. Einführung
Da wir beschlossen haben, die „LEGO-Figur in ihre Teile zu zerlegen“, klären wir zuerst, welche Werkzeuge uns dafür in .NET zur Verfügung stehen. Anders gesagt — welche Standardklassen helfen beim Serialisieren und Deserialisieren von Objekten in verschiedene Formate und was hinter jedem von ihnen steckt.
Wie die Serialisierungsfamilie in .NET aufgebaut ist
Zum aktuellen Zeitpunkt (2025) bietet .NET mehrere grundlegende Ansätze zur Serialisierung, jeder mit seinem eigenen Satz an Klassen und Werkzeugen. Die wichtigsten und am häufigsten vorkommenden sind:
- JSON-Serialisierung — die wichtigste und modernste Variante, wird in den meisten Projekten verwendet.
- XML-Serialisierung — etwas altmodischer, aber immer noch häufig im Einsatz.
- Binär-Serialisierung — nur für spezielle Fälle und normalerweise über moderne Drittanbieter-Lösungen.
Viele Beispiele und der Großteil des Codes in .NET 9 verwenden genau JSON, und das ist keine Mode — das ist Industriestandard. Aber .NET unterstützt auch andere Wege — für den Fall der Fälle.
Die Hauptakteure der .NET-Serialisierung
| Format | Serialisierungsklasse | Einfachheit | Performance | Sicherheit | Aktualität |
|---|---|---|---|---|---|
| JSON | |
🔥🔥🔥 | 🔥🔥🔥 | 🔥🔥🔥 | Am aktuellsten |
| XML | |
🔥🔥 | 🔥🔥 | 🔥🔥 | Wird benutzt |
| JSON | Newtonsoft.Json (Json.NET) | 🔥🔥🔥 | 🔥🔥 | 🔥🔥🔥 | Sehr beliebt |
Kurz zu jedem
- System.Text.Json: Der neue Standard für JSON-Serialisierung in .NET, eingeführt in .NET Core 3.0, seit .NET 5+ der Hauptweg. Schnell, leicht, sicher, „out of the box“ in .NET 9 eingebaut. Dokumentation
- XmlSerializer: Der alte und erprobte Weg für XML-Serialisierung. Einfach zu benutzen, aber mit Einschränkungen (z. B. erfordert eine public-Klasse und öffentliche Properties). Gut für Kompatibilität und strikte Datenverträge. Dokumentation
- Newtonsoft.Json: Lange Zeit de-facto-Standard für JSON-Serialisierung vor dem Aufkommen von System.Text.Json. Wird oft für komplexe Szenarien genutzt (Dynamik, private Properties usw.). Dokumentation
Wohin ist BinaryFormatter verschwunden?
Wenn Sie im Internet Ratschläge sehen, BinaryFormatter zu verwenden — höchstwahrscheinlich ist das ein veraltetes Tutorial. Verwenden Sie nicht BinaryFormatter: er wurde aus .NET 9 aus Sicherheitsgründen entfernt. Moderne binäre Serialisierung bieten Drittanbieter-Lösungen — zum Beispiel Protobuf oder MessagePack.
2. Einfache Beispiele
Lassen Sie uns Serialisierung und Deserialisierung praktisch anwenden am Beispiel unserer bereits bekannten Klasse Player aus der Spielwelt.
Bereiten wir die Klasse für die Serialisierung vor
// Player.cs
public class Player
{
public string Name { get; set; }
public int Health { get; set; }
public bool IsAlive { get; set; }
public List<string> Inventory { get; set; }
public Position Position { get; set; }
}
public class Position
{
public int X { get; set; }
public int Y { get; set; }
}
a) JSON-Serialisierung und -Deserialisierung mit System.Text.Json
using System.Text.Json;
Player aragorn = new Player
{
Name = "Aragorn",
Health = 100,
IsAlive = true,
Inventory = new List<string> { "sword", "bow", "healing potion" },
Position = new Position { X = 10, Y = 25 }
};
// Serialisierung des Player-Objekts in einen JSON-String
string json = JsonSerializer.Serialize(aragorn);
// Geben wir das JSON aus
Console.WriteLine(json);
// Deserialisierung des JSON-Strings zurück in ein Player-Objekt
Player? aragornClone = JsonSerializer.Deserialize<Player>(json);
// Prüfen, ob der Klon funktioniert :)
Console.WriteLine(aragornClone?.Name); // Sollte "Aragorn" ausgeben
So einfach ist das — kein „Tanz mit Zauberformeln“ und keine magischen Attribute. Und jetzt — wie das in XML aussieht.
b) XML-Serialisierung und -Deserialisierung mit XmlSerializer
using System.Xml.Serialization;
// Erstellen des Serializers für die Klasse Player
XmlSerializer serializer = new XmlSerializer(typeof(Player));
// Serialisierung in eine Datei
using FileStream fs = new FileStream("aragorn.xml", FileMode.Create);
serializer.Serialize(fs, aragorn); // Speichert Aragorn in einer XML-Datei
// Deserialisierung aus der Datei
using FileStream fs = new FileStream("aragorn.xml", FileMode.Open);
Player aragornFromXml = (Player) serializer.Deserialize(fs)!;
Console.WriteLine(aragornFromXml.Name); // Sollte "Aragorn" ausgeben
Achtung! XmlSerializer verlangt, dass Klassen und ihre Properties öffentlich sind und einen parameterlosen Konstruktor haben (wenn Sie den Konstruktor überschreiben — machen Sie ihn public und ohne Parameter). Sonst schlägt die Serialisierung fehl.
c) JSON-Serialisierung und -Deserialisierung mit Newtonsoft.Json
using Newtonsoft.Json; // Vergessen Sie nicht, das Paket Newtonsoft.Json über NuGet hinzuzufügen!
// Serialisierung
string json2 = JsonConvert.SerializeObject(aragorn);
// Deserialisierung
Player? aragornFromNewtonsoft = JsonConvert.DeserializeObject<Player>(json2);
Console.WriteLine(aragornFromNewtonsoft?.Name); // Wieder "Aragorn"
Sieht fast genauso aus, aber Newtonsoft.Json bietet viele zusätzliche Optionen — z. B. kann man private Felder serialisieren, Formatierungen anpassen und unkonventionelle Szenarien lösen.
4. Nützliche Feinheiten
Standard-Serializer und ihre Fähigkeiten
| Klasse | Format | In .NET eingebaut | Benötigt NuGet-Paket? | Geeignet für Dateien | Geeignet für API | Einfachheit |
|---|---|---|---|---|---|---|
|
JSON | Ja | Nein | Ja | Ja | Leicht |
|
JSON | Nein | Ja | Ja | Ja | Leicht |
|
XML | Ja | Nein | Ja | Oft | Leicht |
Wie entscheidet man, welche Klasse man verwenden soll?
Wenn Sie nicht wissen, wofür Sie XML brauchen — nehmen Sie fast immer JSON und System.Text.Json. Das ist schneller, einfacher und entspricht modernen Praktiken.
XML sollte man wählen, wenn:
- Sie mit alten Systemen integrieren, die genau XML verlangen.
- Eine strikte Schema- und Strukturvalidierung nötig ist.
- Die Strukturen groß, stabil und formale Kompatibilität wichtig ist (Einstellungen, Konfigurationen, Austausch mit Enterprise-Systemen).
JSON — wenn:
- Sie eine moderne Anwendung bauen und mit Web- oder Mobilclients kommunizieren.
- Einfache Handhabung, Lesbarkeit und Kompaktheit wichtig sind.
- Sie keine zusätzlichen Abhängigkeiten mitziehen wollen.
Newtonsoft.Json — wenn:
- Sie private Felder serialisieren müssen, spezielle Anpassungen brauchen, volle Flexibilität benötigen.
- Oder das Projekt diese Bibliothek bereits verwendet und eine Migration gerade nicht sinnvoll ist.
5. Typische Fehler und Fallstricke
Encoding. Die Standard-Serializer (besonders bei Dateizugriffen) verwenden UTF-8. Wenn Sie „Krakenzeichen“ sehen, prüfen Sie, wie Sie Dateien lesen/schreiben und ob die Encoding explizit gesetzt ist. Dokumentation zur Einstellung der Kodierung.
Nicht unterstützte Typen. Einige Standard-Serializer (vor allem XML) können z. B. Dictionaries (Dictionary), private/protected-Felder, Events, Delegates und Interfaces nicht direkt serialisieren. Gewöhnlich werden öffentliche einfache Properties und Klassen unterstützt.
Versionierung von Klassen. Wenn Sie die Struktur von Klassen ändern (Properties hinzufügen/umbenennen/entfernen), können alte gespeicherte Daten nicht mehr gelesen oder falsch deserialisiert werden. Planen Sie ein Formatversioning ein.
Null-Werte. Bei der Deserialisierung gilt: Wenn ein Feld in den Daten fehlt, bekommt die entsprechende Property den Default-Wert (bei Referenztypen — null). Denken Sie an entsprechende Prüfungen.
Attribute. Zur feinen Steuerung verwendet man oft Attribute wie [JsonIgnore], [XmlElement] usw. Sie erlauben, Properties auszuschließen, Elementnamen zu ändern und das Format zu steuern — Details in den nächsten Vorlesungen.
GO TO FULL VERSION