Auswählen eines Serialisierungsmoduls
Es gibt keinen direkten Ersatz für BinaryFormatter, aber es gibt mehrere Serialisierungsmodule, die für die Serialisierung von .NET-Typen empfohlen werden. Unabhängig davon, welches Serialisierungsmodul Sie auswählen, sind Änderungen für die Integration mit dem neuen Serialisierungsmodul erforderlich. Bei diesen Migrationen sollten Sie unbedingt die Kompromisse zwischen der Erzwingung für das neue Serialisierungsmodul, vorhandene Typen mit möglichst wenig Änderungen zu verarbeiten, und der Umgestaltung von Typen berücksichtigen, um die idiomatische serialization mit dem ausgewählten Serialisierungsmodul zu ermöglichen. Sobald Sie ein Serialisierungsmodul ausgewählt haben, sollten Sie die bewährten Methoden in der zugehörigen Dokumentation lesen.
Wenn das Format für die binäre serialization keine Anforderung ist, können Sie die Verwendung von JSON- oder XML-serialization-Formaten in Betracht ziehen. Diese Serialisierungsmodule sind in .NET enthalten und werden offiziell unterstützt.
- JSON mit System.Text.Json
- XML mit
System.Runtime.Serialization.DataContractSerializer
Wenn eine kompakte binäre Darstellung für Ihre Szenarien wichtig ist, werden die folgenden serialization-Formate und Open-Source-Serialisierungsmodule empfohlen:
Ob Sie die API-Form des serialisierten Typs ändern können, beeinflusst Ihre Richtung und Ihren Ansatz bei der serialization. Die Migration zu diesen Serialisierungsmodulen ist möglicherweise einfacher mit der Möglichkeit, Typen mit neuen Attributen zu kommentieren, neue Konstruktoren hinzuzufügen, Typen/Member öffentlich zu machen und Felder in Eigenschaften zu ändern. Ohne diese Möglichkeit erfordert die Verwendung moderner Serialisierungsmodule möglicherweise eine Implementierung von benutzerdefinierten Konvertern oder Resolvern.
Funktion | BinaryFormatter | System.Text.Json | DataContractSerializer | MessagePack für C# | protobuf-net |
---|---|---|---|---|---|
Serialization-Format | binär (NRBF) | JSON | XML | binär (MessagePack) | binary (Protokollpuffer) |
Kompakte Darstellung | ✔️ | ❌ | ❌ | ✔️ | ✔️ |
Für Menschen lesbar | ❌️ | ✔️ | ✔️ | ❌️ | ❌️ |
Leistung | ❌️ | ✔️ | ❌ | ✔️ | ✔️ |
Unterstützung des [Serializable] -Attributs |
✔️ | ❌ | ✔️ | ❌ | ❌ |
Serialisieren öffentlicher Typen | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Serialisieren nicht öffentlicher Typen | ✔️ | ✔️ | ✔️ | ✔️ (Resolver erforderlich) | ✔️ |
Serialisieren von Feldern | ✔️ | ✔️ (aktivieren) | ✔️ | ✔️ (Attribut erforderlich) | ✔️ (Attribut erforderlich) |
Serialisieren nicht öffentlicher Felder | ✔️ | ✔️ (Resolver erforderlich) | ✔️ | ✔️ (Resolver erforderlich) | ✔️ (Attribut erforderlich) |
Serialisieren von Eigenschaften | ✔️* | ✔️ | ✔️ | ✔️ (Attribut erforderlich) | ✔️ (Attribut erforderlich) |
Deserialisieren von schreibgeschützten Membern | ✔️ | ✔️ (Attribut erforderlich) | ✔️ | ✔️ | ✔️ (Parameterloser Akteur erforderlich) |
Polymorphe Typhierarchie | ✔️ | ✔️ (Attribut erforderlich) | ✔️ | ✔️ (Attribut erforderlich) | ✔️ (Attribut erforderlich) |
AOT-Unterstützung | ❌️ | ✔️ | ❌ | ✔️ | ❌ (geplant) |
JSON mit „System.Text.Json“
Die Bibliothek System.Text.Json
ist ein modernes Serialisierungsmodul, bei dem Sicherheit, hohe Leistung und geringe Speicherbelegung für das JSON-Format (JavaScript Object Notation) im Fokus steht. JSON ist für Menschen lesbar und verfügt über eine breite plattformübergreifende Unterstützung. Das textbasierte Format ist zwar nicht so kompakt wie binäre Formate, kann aber durch Komprimierung erheblich verkleinert werden.
Serialization schließt nicht öffentliche und schreibgeschützte Member aus, es sei denn, sie werden speziell über Attribute und Konstruktoren behandelt. „System.Text.Json“ unterstützt außerdem benutzerdefinierte serialization und Deserialisierung, um mehr Kontrolle darüber zu erhalten, wie Typen in JSON und umgekehrt konvertiert werden. „System.Text.Json“ unterstützt das Attribut [Serializable]
nicht.
Migrieren zu „System.Text.Json“ (JSON)
XML mit DataContractSerializer
DataContractSerializer wurde in .NET Framework 3.0 eingeführt und wird verwendet, um in WCF-Nachrichten (Windows Communication Foundation) gesendete Daten zu serialisieren und deserialisieren. DataContractSerializer ist ein XML-Serialisierungsmodul, das das Programmierungsmodell von serialization vollständig unterstützt, welches von BinaryFormatter
verwendet wurde. Das bedeutet, das es das Attribut [Serializable]
und die Implementierung von ISerializable berücksichtigt. Daher erfordert dieses Serialisierungsmodul den geringsten Aufwand bei der Migration. Es setzt jedoch voraus, dass die bekannten Typen vorab angegeben werden. (Die meisten .NET-Auflistungen und primitiven Typen sind jedoch in einer Standardpositivliste enthalten und müssen nicht angegeben werden.)
DataContractSerializer
bietet zwar diese funktionalen Vorteile bei der Migration von BinaryFormatter, ist aber nicht so modern oder leistungsfähig wie die anderen Optionen.
Migrieren zu DataContractSerializer (XML)
Warnung
Verwechseln Sie DataContractSerializer allerdings nicht mit NetDataContractSerializer. NetDataContractSerializer wird als gefährlicher Serialisierer identifiziert.
Binär mit MessagePack
MessagePack ist ein kompaktes Format für die binäre serialization, das im Vergleich zu JSON und XML zu geringeren Nachrichtengrößen führt. Die Open Source-Bibliothek MessagePack für C# ist äußerst leistungsfähig und bietet integrierte sehr schnelle LZ4-Komprimierung für eine noch geringere Datengröße. Es funktioniert am besten, wenn Datentypen mit DataContractSerializer
oder den eigenen Attributen der Bibliothek kommentiert werden. Sie kann so konfiguriert werden, dass AOT-Umgebungen, nicht öffentliche Typen und Member sowie schreibgeschützte Typen und Member unterstützt werden.
Migrieren zu MessagePack (binär)
Binär mit protobuf-net
Die protobuf-net-Bibliothek ist ein vertragsbasiertes Serialisierungsmodul für .NET, das das binäre Format der Protokollpufferserialization verwendet. Die API folgt typischen .NET-Mustern und ist weitgehend mit XmlSerializer
und DataContractSerializer
vergleichbar. Diese beliebte Bibliothek bietet ebenfalls zahlreiche Funktionen und kann nicht öffentliche Typen und Felder verarbeiten. In vielen Szenarien müssen jedoch Attribute auf Member angewendet werden.