Compartilhar via


Migrar para System.Text.Json (JSON)

A biblioteca System.Text.Json usa como padrão enfatizar o comportamento literal e determinístico e evita qualquer adivinhação ou interpretação em nome do chamador. A biblioteca foi projetada intencionalmente dessa forma por conta do desempenho e segurança. Embora System.Text.Json seja altamente configurável e seus recursos possam ser usados para minimizar as alterações necessárias nos tipos serializados, é importante considerar as compensações entre lidar com tipos existentes com o mínimo de alterações possível versus tipos de refatoração para habilitar tipos idiomáticos e seguros serialization.

Ao migrar de BinaryFormatter para System.Text.Json, é crucial observar os seguintes comportamentos e opções:

  • Por padrão, os campos não são serializados ou desserializados por System.Text.Json, mas podem ser anotados para serialization. Como alternativa, JsonSerializerOptions.IncludeFields pode ser cuidadosamente definido como true para incluir todos os campos públicos para os tipos que estão sendo serializados.

    JsonSerializerOptions options = new()
    {
        IncludeFields = true
    };
    
  • Por padrão, System.Text.Jsonignora campos e propriedades privados. Você pode habilitar o uso de um acessador não público em uma propriedade usando o atributo [JsonInclude]. A inclusão de campos privados requer um trabalho extra considerável.

  • System.Text.Jsonnão pode desserializar campos ou propriedades somente leitura, mas o atributo [JsonConstructor] pode ser usado para indicar que o construtor especificado deve ser usado para criar instâncias do tipo na desserialização. O construtor pode definir os campos e as propriedades somente leitura.

  • Para substituir o comportamento padrão serialization de um tipo específico, você pode escrever conversores personalizados.

  • Ele dá suporte à serialization e desserialização de muitas coleções, mas há limitações. Consulte a documentação de tipos de coleção com suporte para obter detalhes sobre quais coleções têm suporte para serialization e desserialização.

  • Sob determinadas condições, ele dá suporte à serialization e desserialização de coleções genéricas personalizadas.

  • Outros tipos sem suporte interno são: DataSet, DataTable, DBNull, TimeZoneInfo, Type, ValueTuple. No entanto, você pode escrever um conversor personalizado para dar suporte a esses tipos.

  • Ele dá suporte à hierarquia de tipo polimórfico serialization e à desserialização em que os tipos foram explicitamente aceitos por meio do atributo [JsonDerivedType] ou do conversor personalizado. Não há suporte para hierarquias de herança abertas e o arredondamento com polimorfismo requer identificadores discriminatórios de tipo para todos os tipos derivados conhecidos.

  • O atributo [JsonIgnore] em uma propriedade permite que a propriedade seja omitida do JSON durante a serialization.

  • Para preservar referências e lidar com referências circulares em System.Text.Json, defina JsonSerializerOptions.ReferenceHandler como ReferenceHandler.Preserve.

  • Serialization pode ser amplamente personalizado com contratos personalizados, desbloqueando muitos cenários, minimizando as alterações em tipos serializados.