Migrieren zu DataContractSerializer (XML)
Die .NET-Basisklassenbibliotheken stellen zwei XML-Serialisierer bereit: XmlSerializer und DataContractSerializer. Es gibt einige subtile Unterschiede zwischen beiden, aber für den Zweck der Migration konzentriert sich dieser Abschnitt nur auf DataContractSerializer
. Warum? Weil es das serialization-Programmierungsmodell vollständig unterstützt, das von BinaryFormatter
verwendet wurde. Alle Typen, die bereits als [Serializable]
gekennzeichnet sind oder ISerializable
implementieren, können mit DataContractSerializer
serialisiert werden. Wo ist der Haken? Bekannte Typen müssen im Vorfeld angegeben werden. Sie müssen sie kennen und in der Lage sein, die Type
zu erhalten, auch für private Typen.
Es ist nicht erforderlich, die gängigsten Auflistungen oder Grundtypen wie string
oder DateTime
anzugeben (der Serializer verfügt über eine eigene Standard-Zulassungsliste), aber es gibt Ausnahmen wie DateTimeOffset
. Weitere Informationen finden Sie unter Vom Datenvertragsserialisierer unterstützte Typen.
Partielle Vertrauensstellung ist ein .NET Framework-Feature, das nicht zu .NET (Core) portiert wurde. Wenn Ihr Code auf .NET Framework ausgeführt wird und dieses Feature verwendet, lesen Sie die Einschränkungen, die für ein solches Szenario gelten könnten.
Schritt-für-Schritt-Migration
- Ermitteln Sie alle Verwendungen von
BinaryFormatter
. - Stellen Sie sicher, dass die serialization-Codepfade mit Tests abgedeckt sind, um Ihre Änderungen zu überprüfen und um Fehler zu vermeiden.
- Sie müssen keine Pakete installieren, da
DataContractSerializer
Teil der .NET-Kernbibliotheken ist. - Suchen Sie alle Typen, die mit
BinaryFormatter
serialisiert werden. Sie müssen keines dieser Elemente ändern, sie aber möglicherweise über dasknownTypes
-Argument desDataContractSerializer
-Konstruktors auflisten. - Ersetzen Sie die Nutzung von
BinaryFormatter
durchDataContractSerializer
.
DataContractSerializer serializer = new(
type: input.GetType(),
knownTypes: new Type[]
{
typeof(MyType1),
typeof(MyType2)
});