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.Json
programu należy pamiętać o następujących zachowaniach i opcjach:
Domyślnie pola nie są serializowane ani deserializowane przez
System.Text.Json
element , 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.Jsonprogram 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. Zapoznaj się z dokumentacją obsługiwanych typów kolekcji, aby uzyskać szczegółowe informacje na temat obsługiwanych serialization kolekcji i deserializacji.
W pewnych warunkach obsługuje serialization i deserializuje niestandardowe kolekcje ogólne.
Inne typy bez wbudowanej obsługi to:
DataSet
, ,DataTable
,DBNull
TimeZoneInfo
,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 .serializationAby zachować odwołania i obsłużyć odwołania cykliczne w elemencie
System.Text.Json
, ustaw wartośćJsonSerializerOptions.ReferenceHandler
ReferenceHandler.Preserve
.Serialization można znacznie dostosować za pomocą kontraktów niestandardowych, odblokowując wiele scenariuszy, jednocześnie minimalizując zmiany w serializowanych typach.