Freigeben über


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

  1. Ermitteln Sie alle Verwendungen von BinaryFormatter.
  2. Stellen Sie sicher, dass die serialization-Codepfade mit Tests abgedeckt sind, um Ihre Änderungen zu überprüfen und um Fehler zu vermeiden.
  3. Sie müssen keine Pakete installieren, da DataContractSerializer Teil der .NET-Kernbibliotheken ist.
  4. Suchen Sie alle Typen, die mit BinaryFormatter serialisiert werden. Sie müssen keines dieser Elemente ändern, sie aber möglicherweise über das knownTypes-Argument des DataContractSerializer-Konstruktors auflisten.
  5. Ersetzen Sie die Nutzung von BinaryFormatter durch DataContractSerializer.
DataContractSerializer serializer = new(
    type: input.GetType(),
    knownTypes: new Type[]
    {
        typeof(MyType1),
        typeof(MyType2)
    });