System.Text.Json (JSON) に移行する
System.Text.Json
ライブラリは、既定ではリテラルで決定論的な動作を重視し、呼び出し元のための推測や解釈は行われません。 このライブラリは、セキュリティとパフォーマンスのために、意図的にこのように設計されています。 System.Text.Json
は高度な構成が可能であり、その機能を使用して、シリアル化された型に必要な変更を最小限に抑えることができますが、既存の型を可能な限り少ない変更で処理することと、型をリファクタリングして慣用的かつ安全なserializationを可能にすることとの間のトレードオフを考慮することが重要です。
BinaryFormatter から System.Text.Json
に移行する際は、次の動作とオプションに注意することが重要です。
既定では、フィールドは
System.Text.Json
によってシリアル化または逆シリアル化されませんが、serialization用に注釈を付けることができます。 または、JsonSerializerOptions.IncludeFields
を慎重にtrue
に設定して、シリアル化される型のすべてのパブリック フィールドを含めることもできます。JsonSerializerOptions options = new() { IncludeFields = true };
既定では、System.Text.Json はプライベートのフィールドおよびプロパティは無視します。 プロパティ上で非パブリック アクセサーの使用を有効にするには、
[JsonInclude]
属性を使用します。 プライベート フィールドを含めるには、いくつかの重要な追加作業が必要です。System.Text.Jsonは読み取り専用のフィールドまたはプロパティを逆シリアル化できませんが、
[JsonConstructor]
属性を使用して、指定のコンストラクターを使用して逆シリアル化の型のインスタンスを作成する必要があることを示すことができます。 コンストラクターでは、読み取り専用のフィールドおよびプロパティを設定できます。特定の型の既定のserialization動作をオーバーライドするには、カスタム コンバーターを作成します。
多数のコレクションのserializationと逆シリアル化がサポートされていますが、制限があります。 serializationと逆シリアル化がサポートされているコレクションの詳細については、サポートされているコレクション型のドキュメントを参照してください。
特定の条件下では、カスタム ジェネリック コレクションのserializationと逆シリアル化がサポートされます。
組み込みのサポートがないその他の型は、
DataSet
、DataTable
、DBNull
、TimeZoneInfo
、Type
、ValueTuple
です。 ただし、これらの型をサポートするカスタム コンバーターを作成することはできます。[JsonDerivedType]
属性またはカスタム コンバーターを介して型が明示的に選択された場合、ポリモーフィックな型階層のserializationと逆シリアル化がサポートされます。 オープンな継承階層はサポートされていません。ポリモーフィズムを使用したラウンドトリップには、既知のすべての派生型の型識別子が必要です。プロパティで
[JsonIgnore]
属性を使用すると、serialization中にそのプロパティが JSON から除外されます。System.Text.Json
で参照を保持し、循環参照を処理するには、JsonSerializerOptions.ReferenceHandler
をReferenceHandler.Preserve
に設定します。Serialization は、カスタム コントラクトを使用して広範囲にカスタマイズできます。シリアル化された型への変更を最小限に抑えながら、多くのシナリオを実現します。
.NET