Delen via


Migreren naar DataContractSerializer (XML)

De .NET-basisklassebibliotheken bieden twee XML-serializers: XmlSerializer en DataContractSerializer. Er zijn enkele subtiele verschillen tussen deze twee, maar voor het doel van de migratie richt deze sectie zich alleen op DataContractSerializer. Waarom? Omdat het volledig ondersteuning biedt voor het serialisatieprogrammeermodel dat door BinaryFormatteris gebruikt. Alle typen die al zijn gemarkeerd als [Serializable] of geïmplementeerd ISerializable , kunnen worden geserialiseerd met DataContractSerializer. Waar is de vangst? Bekende typen moeten vooraf worden opgegeven. U moet ze kennen en de Type, zelfs voor privétypen kunnen krijgen.

Het is niet vereist om de populairste verzamelingen of primitieve typen op te geven, zoals string of DateTime (de serializer heeft een eigen standaard acceptatielijst), maar er zijn uitzonderingen zoals DateTimeOffset. Zie Typen die worden ondersteund door de serializer van het gegevenscontract voor meer informatie over de ondersteunde typen.

Gedeeltelijke vertrouwensrelatie is een .NET Framework-functie die niet is overgezet naar .NET (Core). Als uw code wordt uitgevoerd op .NET Framework en deze functie gebruikt, leest u meer over de beperkingen die van toepassing kunnen zijn op een dergelijk scenario.

Stapsgewijze migratie

  1. Zoek alle gebruiksgegevens van BinaryFormatter.
  2. Zorg ervoor dat de serialisatiecodepaden worden behandeld met tests, zodat u uw wijzigingen kunt controleren en fouten kunt voorkomen.
  3. U hoeft geen pakketten te installeren, zoals DataContractSerializer onderdeel is van de .NET Core-bibliotheken.
  4. Zoek alle typen waarmee wordt geserialiseerd BinaryFormatter. U hoeft ze niet te wijzigen, maar mogelijk moet u deze weergeven via knownTypes het argument van de DataContractSerializer constructor.
  5. Vervang het gebruik door BinaryFormatterDataContractSerializer.
DataContractSerializer serializer = new(
    type: input.GetType(),
    knownTypes: new Type[]
    {
        typeof(MyType1),
        typeof(MyType2)
    });