首页 >后端开发 >C++ >使用自定义 System.Text.Json JsonConverter 时如何保留默认序列化?

使用自定义 System.Text.Json JsonConverter 时如何保留默认序列化?

Patricia Arquette
Patricia Arquette原创
2025-01-10 10:55:40235浏览

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. 添加到 Converters 集合的转换器

在这种情况下,您可以通过以下方式修改 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>

其他说明

  • 使用 DefaultConverterFactory 将自定义转换器应用于自定义值类型或 POCO 可能会导致堆栈溢出。
  • 修改后的代码允许在提供的示例中正确进行默认序列化。

以上是使用自定义 System.Text.Json JsonConverter 时如何保留默认序列化?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn