ホームページ > バックエンド開発 > C++ > カスタム System.Text.Json JsonConverter を使用するときにデフォルトのシリアル化を保持する方法は?

カスタム System.Text.Json JsonConverter を使用するときにデフォルトのシリアル化を保持する方法は?

Patricia Arquette
リリース: 2025-01-10 10:55:40
オリジナル
196 人が閲覧しました

How to Preserve Default Serialization When Using a Custom System.Text.Json JsonConverter?

カスタム System.Text.Json JsonConverter でデフォルトのシリアル化を実装します

カスタム System.Text.Json.JsonConverter<T> を実装してデータ モデルをアップグレードする場合、Write() メソッドをオーバーライドする必要がある場合があります。ただし、場合によっては、デフォルトのシリアル化動作を保持したい場合があります。これを達成するには、次の戦略を利用できます。

1. プロパティに適用される JsonConverter

カスタム コンバーターがプロパティに適用されている場合、Write() メソッド内で JsonSerializer.Serialize(writer, person, options); を呼び出すだけで、デフォルトのシリアル化が生成されます。

2. コンバーター コレクションにコンバーターが追加されました

この場合、次のようにして Write() メソッドの Converters コレクションを変更できます。

<code class="language-csharp">public override void Write(Utf8JsonWriter writer, Person person, JsonSerializerOptions options)
{
    // 复制传入的选项并移除自定义转换器。
    var modifiedOptions = options.CopyAndRemoveConverter(typeof(PersonConverter));
    JsonSerializer.Serialize(writer, person, modifiedOptions);
}</code>
ログイン後にコピー

3. カスタム値タイプまたは POCO に適用される JsonConverter

現在、このシナリオのデフォルトのシリアル化を生成する組み込みメソッドはありません。

4. JsonConverterFactory によって返されるコンバーター

コンバーター リストでコンバーター ファクトリの使用を無効にするには、ファクトリの適用時にシリアル化をスキップするカスタム コンバーターを返す

を作成することを検討してください。 JsonConverterFactory

実装の改善

提供された例では、改善された実装では

が使用されています。このクラスを使用すると、製造されたコンバータでコピーされたオプションを簡単にキャッシュできるようになります。完全な実装は次のようになります: DefaultConverterFactory<T>

<code class="language-csharp">public sealed class PersonConverter : DefaultConverterFactory<Person>
{
    // ... 原问题的现有代码 ...
}

public abstract class DefaultConverterFactory<T> : JsonConverterFactory
{
    // ... 接受的答案中的现有代码 ...
}

public static class JsonSerializerExtensions
{
    // ... 接受的答案中的现有代码 ...
}</code>
ログイン後にコピー

その他の指示

  • を使用してカスタム コンバーターをカスタム値型または POCO に適用すると、スタック オーバーフローが発生する可能性があります。 DefaultConverterFactory
  • コードを変更すると、提供された例で正しいデフォルトのシリアル化が可能になります。

以上がカスタム System.Text.Json JsonConverter を使用するときにデフォルトのシリアル化を保持する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート