Modalità di generazione dell'origine in System.Text.Json
La generazione di origine può essere usata in due modalità: Ottimizzazione della serializzazione e basata su metadati. Questo articolo descrive le diverse modalità.
Per informazioni su come usare le modalità di generazione di origine, vedere Come usare la generazione di origine in System.Text.Json.
Modalità basata su metadati
È possibile usare la generazione di origine per spostare il processo di raccolta dei metadati dal runtime al tempo di compilazione. Durante la compilazione, i metadati vengono raccolti e vengono generati i file di codice sorgente. I file di codice sorgente generati vengono compilati automaticamente come parte integrante dell'applicazione. Questa tecnica elimina la raccolta di metadati in fase di esecuzione, migliorando le prestazioni della serializzazione e della deserializzazione.
I miglioramenti delle prestazioni offerti dalla generazione di origine possono essere sostanziali. Ad esempio, i risultati dei test hanno mostrato fino al 40% o più riduzione del tempo di avvio, riduzione della memoria privata, aumento della velocità effettiva (in modalità di ottimizzazione della serializzazione) e riduzione delle dimensioni dell'app.
Problemi noti
Solo public
le proprietà e i campi sono supportati per impostazione predefinita in modalità di serializzazione. Tuttavia, la modalità reflection supporta l'uso delle funzioni di private
accesso, mentre la modalità di generazione dell'origine non è attiva. Ad esempio, è possibile applicare l'attributo JsonInclude a una proprietà con un private
setter o un getter e che verrà serializzata in modalità reflection. La modalità di generazione dell'origine supporta solo public
le funzioni di accesso o internal
le funzioni di accesso delle public
proprietà. Se si impostano [JsonInclude]
funzioni di accesso non pubbliche e si sceglie la modalità di generazione dell'origine, verrà generata un'eccezione NotSupportedException
in fase di esecuzione.
Solo public
le proprietà e i campi sono supportati per impostazione predefinita in modalità di serializzazione. Tuttavia, la modalità reflection supporta l'uso di membri e private
funzioni di private
accesso, mentre la modalità di generazione dell'origine non è attiva. Ad esempio, se si applica l'attributo JsonInclude a una private
proprietà o a una proprietà con un private
setter o getter, verrà serializzato in modalità reflection. La modalità di generazione dell'origine supporta solo public
membri o internal
funzioni di accesso o public
internal
di public
proprietà. Se si impostano [JsonInclude]
private
su membri o funzioni di accesso e si sceglie la modalità di generazione dell'origine, verrà generata un'eccezione NotSupportedException
in fase di esecuzione.
Per informazioni su altri problemi noti relativi alla generazione dell'origine, vedere i problemi di GitHub etichettati come "generatore di origine" nel repository dotnet/runtime .
Modalità Ottimizzazione della serializzazione (percorso rapido)
JsonSerializer
include molte funzionalità che personalizzano l'output della serializzazione, ad esempio i criteri di denominazione e conservano i riferimenti. Il supporto per tutte queste funzionalità causa un sovraccarico delle prestazioni. La generazione di origine può migliorare le prestazioni di serializzazione generando codice ottimizzato che usa Utf8JsonWriter
direttamente.
Il codice ottimizzato non supporta tutte le funzionalità di serializzazione supportate JsonSerializer
. Il serializzatore rileva se il codice ottimizzato può essere usato ed esegue il fallback al codice di serializzazione predefinito se vengono specificate opzioni non supportate. Ad esempio, JsonNumberHandling.AllowReadingFromString non è applicabile alla scrittura, quindi la specifica di questa opzione non causa un fallback al codice predefinito.
La tabella seguente illustra le opzioni in JsonSerializerOptions
supportate dalla serializzazione fast-path:
Opzione di serializzazione | Supportato per fast-path |
---|---|
AllowTrailingCommas | ✔️ |
Converters | ❌ |
DefaultBufferSize | ✔️ |
DefaultIgnoreCondition | ✔️ |
DictionaryKeyPolicy | ❌ |
Encoder | ❌ |
IgnoreNullValues | ❌ |
IgnoreReadOnlyFields | ✔️ |
IgnoreReadOnlyProperties | ✔️ |
IncludeFields | ✔️ |
MaxDepth | ✔️ |
NumberHandling | ❌ |
PropertyNamingPolicy | ✔️ |
ReferenceHandler | ❌ |
TypeInfoResolver | ✔️ |
WriteIndented | ✔️ |
Le opzioni seguenti non sono supportate perché si applicano solo alla deserializzazione: PropertyNameCaseInsensitive, ReadCommentHandlinge UnknownTypeHandling.
La tabella seguente illustra gli attributi supportati dalla serializzazione fast-path:
Attributo | Supportato per fast-path |
---|---|
JsonConstructorAttribute | ❌ |
JsonConverterAttribute | ❌ |
JsonDerivedTypeAttribute | ✔️ |
JsonExtensionDataAttribute | ❌ |
JsonIgnoreAttribute | ✔️ |
JsonIncludeAttribute | ✔️ |
JsonNumberHandlingAttribute | ❌ |
JsonPolymorphicAttribute | ✔️ |
JsonPropertyNameAttribute | ✔️ |
JsonPropertyOrderAttribute | ✔️ |
JsonRequiredAttribute | ✔️ |
Se per un tipo viene specificata un'opzione o un attributo non supportato, il serializzatore esegue il fallback alla modalità metadati, presupponendo che il generatore di origine sia stato configurato per generare metadati. In tal caso, il codice ottimizzato non viene usato durante la serializzazione di tale tipo, ma può essere usato per altri tipi. È quindi importante eseguire test delle prestazioni con le opzioni e i carichi di lavoro per determinare il vantaggio che è effettivamente possibile ottenere dalla modalità di ottimizzazione della serializzazione. Inoltre, la possibilità di eseguire il fallback al JsonSerializer
codice richiede la modalità di raccolta dei metadati. Se si seleziona solo la modalità di ottimizzazione della serializzazione, la serializzazione potrebbe non riuscire per tipi o opzioni che devono eseguire il fallback al JsonSerializer
codice.
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per