Sdílet prostřednictvím


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.Jsonje 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 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í 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, DBNullTimeZoneInfo, , 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 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ů.