System.InvalidOperationException:las opciones del serializador no se pueden cambiar una vez que se ha producido la serialización o deserialización

System.InvalidOperationException:las opciones del serializador no se pueden cambiar una vez que se ha producido la serialización o deserialización

Problema

Al usar System.Text.Json, es una buena idea reutilizar los objetos JsonSerializerOptions. Esto conduce a una aceleración masiva de 200x en llamadas posteriores al serializador.

La desventaja es que no puede cambiar las propiedades en el objeto de opciones después de haberlo pasado en una llamada Serialize()/Deserialize(). Obtendrá la excepción:

Solución

Esta excepción revela una extraña decisión de diseño de API con respecto a System.Text.Json. Por lo general, las cosas son inmutables o no. En este caso, las propiedades de JsonSerializerOptions son condicionalmente inmutables.

Para solucionar este problema, necesitará un nuevo objeto JsonSerializerOptions para cada combinación de configuraciones que desee usar.

Por ejemplo, el siguiente código serializa un objeto Person con y sin sangría, por lo que necesita dos objetos JsonSerializerOptions diferentes.

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)