Udostępnij za pośrednictwem


Migrowanie do System.Text.Json (JSON)

Biblioteka System.Text.Json domyślnie podkreśla literał, deterministyczne zachowanie i unika odgadnięcia lub interpretacji w imieniu wywołującego. Biblioteka została celowo zaprojektowana w ten sposób pod kątem zabezpieczeń i wydajności. Chociaż System.Text.Json jest wysoce konfigurowalny, a jego funkcje mogą służyć do zminimalizowania zmian wymaganych do serializacji typów, ważne jest, aby wziąć pod uwagę kompromis między obsługą istniejących typów z jak najmniejszą liczbą zmian w porównaniu z typami refaktoryzacji w celu włączenia idiomatycznego i bezpiecznego serialization.

Podczas migracji z BinaryFormatter systemu do System.Text.Jsonprogramu należy pamiętać o następujących zachowaniach i opcjach:

  • Domyślnie pola nie są serializowane ani deserializowane przez System.Text.Jsonelement , ale mogą być oznaczone jako serialization. Alternatywnie można zachować ostrożność, JsonSerializerOptions.IncludeFields aby uwzględnić true wszystkie pola publiczne dla typów, które są serializowane.

    JsonSerializerOptions options = new()
    {
        IncludeFields = true
    };
    
  • Domyślnie System.Text.Jsonignoruje pola prywatne i właściwości. Możesz włączyć użycie metody dostępu innej niż publiczna we właściwości przy użyciu atrybutu [JsonInclude] . Uwzględnianie pól prywatnych wymaga dodatkowej pracy.

  • System.Text.Json program nie może wykonać deserializacji pól lub właściwości tylko do odczytu, ale [JsonConstructor] atrybut może służyć do wskazania, że określony konstruktor powinien służyć do tworzenia wystąpień typu w deserializacji. Konstruktor może ustawić pola i właściwości tylko do odczytu.

  • Aby zastąpić domyślne serialization zachowanie określonego typu, możesz napisać konwertery niestandardowe.

  • Obsługuje serialization ona i deserializacji wielu kolekcji, ale istnieją ograniczenia. Aby uzyskać szczegółowe informacje na temat typów i kolekcji obsługiwanych w i deserializacji, zobacz dokumentację obsługiwanych typów i kolekcji .

  • W pewnych warunkach obsługuje serialization i deserializuje niestandardowe kolekcje ogólne.

  • Inne typy bez wbudowanej obsługi to: DataSet, , DataTable, DBNullTimeZoneInfo, Type, . ValueTuple Można jednak napisać konwerter niestandardowy, aby obsługiwać te typy.

  • Obsługuje hierarchię serialization typów polimorficznych i deserializację , w której typy zostały jawnie uwzględnione za pośrednictwem atrybutu lub konwertera niestandardowego [JsonDerivedType] . Otwarte hierarchie dziedziczenia nie są obsługiwane, a zaokrąglanie z polimorfizmem wymaga identyfikatorów dyskryminujących typu dla wszystkich znanych typów pochodnych.

  • Atrybut [JsonIgnore] we właściwości powoduje pominięcie właściwości z pliku JSON podczas .serialization

  • Aby zachować odwołania i obsłużyć odwołania cykliczne w elemencie System.Text.Json, ustaw wartość JsonSerializerOptions.ReferenceHandlerReferenceHandler.Preserve.

  • Serialization można znacznie dostosować za pomocą kontraktów niestandardowych, odblokowując wiele scenariuszy, jednocześnie minimalizując zmiany w serializowanych typach.