Миграция в System.Text.Json (JSON)

Библиотека System.Text.Json по умолчанию подчеркивает литерал, детерминированное поведение и избегает каких-либо предположений или интерпретаций от имени вызывающего объекта. Библиотека намеренно разработана таким образом, чтобы обеспечить безопасность и производительность. Хотя System.Text.Json обладает высокой настраиваемостью, и его функции можно использовать для минимизации изменений, необходимых для сериализованных типов, важно учитывать компромиссы между обработкой существующих типов с минимальными изменениями и рефакторингом типов для обеспечения идиоматической и безопасной сериализации.

При миграции из BinaryFormatterSystem.Text.Jsonнего важно отметить следующие действия и параметры:

  • По умолчанию поля не сериализуются или десериализируются по System.Text.Json, но их можно аннотировать для сериализации. Кроме того, JsonSerializerOptions.IncludeFields можно осторожно задать для true включения всех общедоступных полей для сериализованных типов.

    JsonSerializerOptions options = new()
    {
        IncludeFields = true
    };
    
  • По умолчанию System.Text.Jsonигнорирует частные поля и свойства. Вы можете включить использование недоступного доступа к свойству с помощью атрибута [JsonInclude] . В том числе частные поля требуют некоторых нетривиальных дополнительных работ.

  • System.Text.Json не может десериализировать поля или свойства только для чтения, но [JsonConstructor] атрибут можно использовать для указания того, что указанный конструктор должен использоваться для создания экземпляров типа при десериализации. Конструктор может задать поля и свойства только для чтения.

  • Чтобы переопределить поведение сериализации по умолчанию для определенного типа, можно написать пользовательские преобразователи.

  • Она поддерживает сериализацию и десериализацию многих коллекций, но существуют ограничения. Дополнительные сведения о типах и коллекциях, поддерживаемых для сериализации и десериализации, см. в документации по поддерживаемым типам и коллекциям.

  • При определенных условияхона поддерживает сериализацию и десериализацию пользовательских обобщенных коллекций.

  • Другие типы без встроенной поддержки: DataSet, DataTable, DBNull, TimeZoneInfo, Type. ValueTuple Однако можно написать пользовательский преобразователь для поддержки этих типов.

  • Она поддерживает сериализацию и десериализацию иерархии полиморфных типов, где типы были явно выбраны с помощью атрибута [JsonDerivedType] или пользовательского преобразователя. Открытые иерархии наследования не поддерживаются, а циклический обход с полиморфизмом требует дискриминационных идентификаторов типов для всех известных производных типов.

  • Атрибут [JsonIgnore] для свойства приводит к тому, что свойство будет опущено из JSON во время сериализации.

  • Для сохранения ссылок и обработки циклических ссылок System.Text.Json задайте для свойства JsonSerializerOptions.ReferenceHandler значение ReferenceHandler.Preserve.

  • Serialization можно значительно настроить с помощью пользовательских контрактов, разблокировав множество сценариев, свести к минимуму изменения сериализованных типов.