System.InvalidOperationException:シリアル化または逆シリアル化が発生すると、シリアライザーのオプションを変更できません

問題

System.Text.Json を使用する場合は、JsonSerializerOptions オブジェクトを再利用することをお勧めします。これにより、シリアライザーへの後続の呼び出しで 200 倍の大幅な高速化が実現します。

欠点は、Serialize()/Deserialize() 呼び出しでオプション オブジェクトを渡した後は、オプション オブジェクトのプロパティを変更できないことです。例外が発生します:

解決策

この例外は、System.Text.Json に関する奇妙な API 設計上の決定を明らかにします。通常、物事は不変かそうでないかです。この場合、JsonSerializerOptions プロパティは条件付きで不変です。

この問題を回避するには、使用する設定の組み合わせごとに新しい JsonSerializerOptions オブジェクトが必要になります。

たとえば、次のコードは Person オブジェクトをインデントありとなしでシリアル化するため、2 つの異なる 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)