System.InvalidOperationException:le opzioni del serializzatore non possono essere modificate dopo che si è verificata la serializzazione o la deserializzazione

System.InvalidOperationException:le opzioni del serializzatore non possono essere modificate dopo che si è verificata la serializzazione o la deserializzazione

Problema

Quando si utilizza System.Text.Json, è una buona idea riutilizzare gli oggetti JsonSerializerOptions. Ciò porta a un enorme aumento della velocità di 200 volte nelle chiamate successive al serializzatore.

Lo svantaggio è che non puoi modificare le proprietà sull'oggetto options dopo averlo passato in una chiamata Serialize()/Deserialize(). Avrai l'eccezione:

Soluzione

Questa eccezione rivela una strana decisione di progettazione dell'API relativa a System.Text.Json. Di solito le cose sono immutabili o meno. In questo caso, le proprietà JsonSerializerOptions sono condizionalmente immutabili.

Per aggirare questo problema, avrai bisogno di un nuovo oggetto JsonSerializerOptions per ogni combinazione di impostazioni che desideri utilizzare.

Ad esempio, il codice seguente serializza un oggetto Person con e senza indentazione, quindi necessita di due diversi oggetti JsonSerializerOptions.

var person = new Person()
{
	Name = "Bobby Fischer"
};
var optionsForHumans = new JsonSerializerOptions()
{
	WriteIndented = true
};
var optionsForComputers = new JsonSerializerOptions()
{
	WriteIndented = false
};

var forHumans = JsonSerializer.Serialize(person, optionsForHumans);

var forComputers = JsonSerializer.Serialize(person, optionsForComputers);
Code language: C# (cs)