System.InvalidOperationException:Serializer-Optionen können nicht mehr geändert werden, nachdem eine Serialisierung oder Deserialisierung stattgefunden hat

System.InvalidOperationException:Serializer-Optionen können nicht mehr geändert werden, nachdem eine Serialisierung oder Deserialisierung stattgefunden hat

Problem

Bei der Verwendung von System.Text.Json empfiehlt es sich, JsonSerializerOptions-Objekte wiederzuverwenden. Dies führt zu einer massiven 200-fachen Beschleunigung bei nachfolgenden Aufrufen des Serialisierers.

Der Nachteil ist, dass Sie die Eigenschaften des Optionsobjekts nicht ändern können, nachdem Sie es in einem Serialize()/Deserialize()-Aufruf übergeben haben. Sie erhalten die Ausnahme:

Lösung

Diese Ausnahme offenbart eine seltsame API-Entwurfsentscheidung in Bezug auf System.Text.Json. Normalerweise sind die Dinge unveränderlich oder nicht. In diesem Fall sind JsonSerializerOptions-Eigenschaften bedingt unveränderlich.

Um dieses Problem zu umgehen, benötigen Sie ein neues JsonSerializerOptions-Objekt für jede Kombination von Einstellungen, die Sie verwenden möchten.

Beispielsweise serialisiert der folgende Code ein Person-Objekt mit und ohne Einrückung, sodass zwei verschiedene JsonSerializerOptions-Objekte benötigt werden.

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)