Freigeben über


Migrieren zu MessagePack (binär)

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.

Einige Verhaltensweisen und Features von MessagePack für C# sind bei Migrationen von BinaryFormatter relevant, insbesondere, wenn Änderungen an den APIs der serialisierten Typen nicht vorgenommen werden können oder minimiert werden müssen.

  • Standardmäßig sind nur öffentliche Typen serialisierbar. Private und interne Strukturen und Klassen können nur serialisiert werden, wenn StandardResolverAllowPrivate.Options als Argument für die Methoden MessagePackSerializer.Serialize und MessagePackSerializer.Deserialize bereitgestellt wird.

  • MessagePack erfordert, dass jeder serialisierbare Typ mit dem [MessagePackObject]-Attribut kommentiert wird. Dies kann mithilfe von ContractlessStandardResolver vermieden werden, aber es kann in Zukunft Probleme mit der Versionsverwaltung verursachen.

  • Jedes serialisierbare nicht statische Feld und eine Eigenschaft müssen mit dem Attribut [Key] kommentiert werden. Wenn Sie den Typ mit dem Attribut [MessagePackObject(keyAsPropertyName: true)] kommentieren, benötigen Member keine expliziten Anmerkungen. Verwenden Sie in diesem Fall das Attribut [IgnoreMember], um bestimmte öffentliche Member zu ignorieren.

  • Verwenden Sie StandardResolverAllowPrivate, um private Member zu serialisieren.

  • System.Runtime.Serialization-Anmerkungen können anstelle von MessagePack-Anmerkungen verwendet werden: [DataContract] anstelle von [MessagePackObject], [DataMember] anstelle von [Key] und [IgnoreDataMember] anstelle von [IgnoreMember]. Diese Anmerkungen können nützlich sein, wenn Sie eine Abhängigkeit von MessagePack in der Bibliothek vermeiden möchten, die serialisierbare Typen definiert.

  • Schreibgeschützte/unveränderliche Typen und Member werden unterstützt. Das Serialisierungsmodul versucht, den öffentlichen Konstruktor mit der am besten passenden Argumentliste zu verwenden. Der Konstruktor kann mithilfe des Attributs [SerializationConstructor] explizit angegeben werden.

  • Serialization beliebiger Typen werden über benutzerdefinierte Formatierer unterstützt, die einfach zu erstellen sind. Dadurch werden alle Anforderungen für Attribute und bestimmte Konstruktor- oder Membermuster entfernt.

  • Das Serialisierungsmodul unterstützt die am häufigsten verwendeten integrierten Typen und Auflistungen, die von den .NET-Basisklassenbibliotheken bereitgestellt werden. Die vollständige Liste finden Sie in der offiziellen Dokumentation. Sie verfügt über Erweiterungspunkte, die Anpassungen ermöglichen.

Warnung

MessagePack enthält APIs, die das Deserialisieren von Daten ohne Typeinschränkungen zulassen. Diese APIs sollten gemäß der MessagePack-Sicherheitshinweise vermieden werden.

Warnung

Einige MessagePack-APIs weisen ein Verhalten auf, das über änderbare statische Elemente angepasst werden kann. Das bedeutet, dass Ihr Code erfolgreich ist oder fehlschlägt, abhängig davon, welche Aktionen anderer Code im selben Prozess (AssemblyLoadContext oder AppDomain) möglicherweise ausführt. Sie können für die Resilienz Ihres Codes sorgen, indem Sie zudem auf das MessagePackAnalyzer-Paket verweisen und die MsgPack001- und MsgPack002-Analysetools aktivieren, die alle Verwendungen von APIs mit änderbarem Verhalten aufrufen.