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 BinaryFormatter
program . 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 Type
wartoś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
- Znajdź wszystkie użycia elementu
BinaryFormatter
. - Upewnij się, że serialization ścieżki kodu są objęte testami, aby można było zweryfikować zmiany i uniknąć wprowadzania usterek.
- Nie musisz instalować żadnych pakietów, ponieważ
DataContractSerializer
jest częścią bibliotek platformy .NET Core. - 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 konstruktoraDataContractSerializer
. - Zastąp użycie elementu ciągiem
BinaryFormatter
DataContractSerializer
.
DataContractSerializer serializer = new(
type: input.GetType(),
knownTypes: new Type[]
{
typeof(MyType1),
typeof(MyType2)
});