Il deserializzatore basato sulla reflection risolve i metadati in modo eager
Il serializzatore basato su reflection System.Text.Json in precedenza usava un approccio di caricamento lazy per risolvere i metadati delle proprietà. Questo approccio consentiva la deserializzazione corretta dei POCO che contenevano tipi di proprietà non supportati, purché il codice JSON sottostante non fosse associato ad alcuna delle proprietà non supportate. Questo accadeva nonostante il fatto che le istanze dello stesso tipo non riuscissero a essere serializzate.
A partire da .NET 8, il serializzatore è stato modificato in modo che tutte le proprietà vengano risolte in modo eager sia nella serializzazione che nella deserializzazione. Questa modifica è stata apportata per aggiungere un supporto migliore alla combinazione di più resolver, che richiede l'analisi anticipata del grafico dei tipi serializzati. Un effetto collaterale di questa modifica è che, se si dipende dal comportamento precedente, è possibile iniziare a visualizzare nuovi errori di deserializzazione del runtime.
Comportamento precedente
Il codice di deserializzazione seguente aveva esito positivo in .NET 7.
var result = JsonSerializer.Deserialize<MyPoco>("""{ "Value": 1 }"""); //, MyContext.Default.MyPoco);
Console.WriteLine(result.Value);
public class MyPoco
{
public int Value { get; set; }
public NestedValue Unsupported { get; set; }
}
public class NestedValue
{
public ReadOnlySpan<byte> Span => Array.Empty<byte>();
}
Nuovo comportamento
A partire da .NET 8, lo stesso codice della sezione Comportamento precedente genera un'eccezione InvalidOperationException in fase di esecuzione.
System.InvalidOperationException: il tipo “System.ReadOnlySpan'1[System.Byte]” della proprietà “Span” sul tipo “NestedValue” non è valido per la serializzazione o la deserializzazione perché si tratta di un tipo puntatore, perché è uno struct di riferimento o contiene parametri generici che non sono stati sostituiti da tipi specifici.
Questo errore è coerente con l'errore generato anche nelle versioni precedenti, se si è tentato di serializzare un'istanza dello stesso tipo. È coerente anche con il generatore di origine, che produce un errore in fase di compilazione.
Versione di introduzione
.NET 8 Anteprima 4
Tipo di modifica che causa un'interruzione
Questa è una modifica funzionale.
Motivo della modifica
Questa modifica era necessaria per via dei nuovi requisiti relativi al supporto della serializzazione fast-path nei contesti generati da origine combinata (vedi dotnet/runtime#71933).
Azione consigliata
Se questa modifica è problematica, puoi:
Rimuovere la proprietà non supportata dal tipo.
Creare un convertitore personalizzato per il tipo non supportato.
Aggiungere l'attributo JsonIgnoreAttribute:
public class MyPoco { public int Value { get; set; } [JsonIgnore] public NestedValue Unsupported { get; set; } }