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 jeho 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í idiomatickou a zabezpečenou serializaci.

Při migraci z BinaryFormatter do System.Text.Jsonje důležité si uvědomit následující chování a možnosti:

  • Ve výchozím nastavení nejsou pole serializována nebo deserializována pomocí nějaké metody System.Text.Json, ale mohou být označeny pro serializaci. Alternativně je možné pečlivě nastavit, JsonSerializerOptions.IncludeFields aby true 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í chování serializace pro určitý typ, můžete psát vlastní převaděče.

  • Podporuje serializaci a deserializaci mnoha kolekcí, ale existují omezení. Podrobnosti o typech a kolekcích, které jsou podporovány pro serializaci a deserializaci, najdete v dokumentaci k podporovaným typům .

  • Za určitých podmínek podporuje serializaci a deserializaci vlastních obecných kolekcí.

  • Jiné typy bez předdefinované podpory jsou: DataSet, DataTable, DBNullTimeZoneInfo, , Type, . ValueTuple Můžete však napsat vlastní převaděč pro podporu těchto typů.

  • Podporuje polymorfní hierarchii typů serializace a deserializace, 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 serializace.

  • Chcete-li zachovat odkazy a zpracovat cyklické odkazy v System.Text.Json, je nastavena JsonSerializerOptions.ReferenceHandler na ReferenceHandler.Preservehodnotu .

  • Serialization lze značně přizpůsobit pomocí vlastních kontraktů, odblokovat mnoho scénářů a současně minimalizovat změny serializovaných typů.