Migrace na System.Text.Json (JSON)
Knihovna System.Text.Json
ve výchozím nastavení zdůrazňuje literálové, deterministické chování a zabraňuje jakémukoli odhadu nebo interpretaci jménem volajícího. Knihovna je záměrně navržena tímto způsobem pro zabezpečení a výkon. I když System.Text.Json
je vysoce konfigurovatelná a její funkce lze použít k minimalizaci změn potřebných pro serializované typy, je důležité zvážit kompromisy mezi zpracováním existujících typů s co nejmenšími změnami a refaktoringovými typy, které umožňují idiomatic a zabezpečení serialization.
Při migraci z BinaryFormatter do System.Text.Json
je důležité si uvědomit následující chování a možnosti:
Ve výchozím nastavení
System.Text.Json
, ale mohou být opatřeny poznámkami pro serialization. Alternativně je možné pečlivě nastavit,JsonSerializerOptions.IncludeFields
abytrue
zahrnovala všechna veřejná pole pro serializované typy.JsonSerializerOptions options = new() { IncludeFields = true };
Ve výchozím nastavení System.Text.Jsonignoruje privátní pole a vlastnosti. Použití neveřejného přístupového objektu u vlastnosti můžete povolit pomocí atributu
[JsonInclude]
. Zahrnutí soukromých polí vyžaduje určitou nesouvisenou práci navíc.System.Text.Json nelze deserializovat pole nebo vlastnosti jen pro čtení, ale
[JsonConstructor]
atribut lze použít k označení, že zadaný konstruktor by měl být použit k vytvoření instancí typu deserializace. Konstruktor může nastavit pole a vlastnosti jen pro čtení.Chcete-li přepsat výchozí serialization chování pro určitý typ, můžete napsat vlastní převaděče.
serialization Podporuje a deserializaci mnoha kolekcí, ale existují omezení. Podrobnosti o tom, které typy a kolekce jsou podporovány pro serialization a deserializaci, najdete v dokumentaci podporovaných typů.
Za určitých podmínek podporuje serialization a deserializaci vlastních obecných kolekcí.
Jiné typy bez předdefinované podpory jsou:
DataSet
,DataTable
,DBNull
TimeZoneInfo
, ,Type
, .ValueTuple
Můžete však napsat vlastní převaděč pro podporu těchto typů.Podporuje hierarchii serialization polymorfních typů a deserializaci , kde byly typy explicitně optovány prostřednictvím atributu
[JsonDerivedType]
nebo vlastního převaděče. Hierarchie otevřené dědičnosti nejsou podporovány a cyklický přechod s polymorfismu vyžaduje identifikátory typu diskriminátoru pro všechny známé odvozené typy.Atribut
[JsonIgnore]
vlastnosti způsobí, že vlastnost bude vynechána z JSON během serialization.Chcete-li zachovat odkazy a zpracovat cyklické odkazy v
System.Text.Json
, je nastavenaJsonSerializerOptions.ReferenceHandler
naReferenceHandler.Preserve
hodnotu .Serialization lze značně přizpůsobit pomocí vlastních kontraktů, odblokovat mnoho scénářů a současně minimalizovat změny serializovaných typů.