Udostępnij za pośrednictwem


Migrowanie do elementu DataContractSerializer (XML)

Biblioteki klas bazowych platformy .NET udostępniają dwa serializatory XML: XmlSerializer i DataContractSerializer. Istnieją pewne subtelne różnice między tymi dwoma elementami, ale w celu migracji ta sekcja koncentruje się tylko na .DataContractSerializer Dlaczego? Ponieważ w pełni obsługuje serialization model programowania, który był używany przez BinaryFormatterprogram . Wszystkie typy, które są już oznaczone jako [Serializable] lub implementowane ISerializable , można serializować za pomocą polecenia DataContractSerializer. Gdzie jest catch? Znane typy muszą być określone z góry. Musisz je znać i mieć możliwość uzyskania Typewartości , nawet w przypadku typów prywatnych.

Nie jest wymagane określenie najpopularniejszych kolekcji lub typów pierwotnych, takich jak string lub DateTime (serializator ma własną domyślną listę dozwolonych), ale istnieją wyjątki, takie jak DateTimeOffset. Aby uzyskać więcej informacji na temat obsługiwanych typów, zobacz Typy obsługiwane przez serializator kontraktu danych.

Częściowe zaufanie to funkcja programu .NET Framework, która nie została przekierowana do platformy .NET (Core). Jeśli kod jest uruchamiany w programie .NET Framework i korzysta z tej funkcji, przeczytaj o ograniczeniach , które mogą mieć zastosowanie do takiego scenariusza.

Migracja krok po kroku

  1. Znajdź wszystkie użycia elementu BinaryFormatter.
  2. Upewnij się, że serialization ścieżki kodu są objęte testami, aby można było zweryfikować zmiany i uniknąć wprowadzania usterek.
  3. Nie musisz instalować żadnych pakietów, ponieważ DataContractSerializer jest częścią bibliotek platformy .NET Core.
  4. Znajdź wszystkie typy, które są serializowane za pomocą polecenia BinaryFormatter. Nie musisz modyfikować żadnego z nich, ale może być konieczne wyświetlenie ich na liście za pomocą knownTypes argumentu konstruktora DataContractSerializer .
  5. Zastąp użycie elementu ciągiem BinaryFormatter DataContractSerializer.
DataContractSerializer serializer = new(
    type: input.GetType(),
    knownTypes: new Type[]
    {
        typeof(MyType1),
        typeof(MyType2)
    });