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 para tipos serializados, é importante considerar as compensações entre lidar com tipos existentes com o mínimo possível de alterações versus tipos de refatoração para habilitar a serialização idiomática e segura.

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

  • Por padrão, campos não são serializados ou desserializados por System.Text.Json, mas podem ser anotados para serialização. 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.Json nã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 de serialização padrão para um tipo específico, você pode escrever conversores personalizados.

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

  • Em determinadas condições, ele dá suporte à serialização 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 à serialização e à desserialização de hierarquia de tipo polimórfico 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 [JsonIgnore] atributo em uma propriedade faz com que a propriedade seja omitida do JSON durante a serialização.

  • 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.