Partilhar via


Migrar para System.Text.Json (JSON)

O System.Text.Json padrão da biblioteca enfatiza o comportamento literal e determinístico e evita qualquer adivinhação ou interpretação em nome do chamador. A biblioteca foi intencionalmente concebida desta forma para garantir a segurança e o desempenho. 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 possível de alterações versus tipos de refatoração para permitir a serialização idiomática e segura.

Ao migrar de BinaryFormatter para o 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 definido cautelosamente para true 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 particulares. Você pode habilitar o uso de um acessador não público em uma propriedade usando o [JsonInclude] atributo. Incluir campos privados requer algum trabalho extra não trivial.

  • System.Text.Json Não é possível desserializar campos ou propriedades somente leitura, mas o [JsonConstructor] atributo 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 somente leitura e propriedades.

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

  • Ele suporta serialização e desserialização de muitas coleções, mas há limitações. Consulte a documentação sobre os tipos suportados para obter detalhes sobre quais tipos e coleções são suportados para serialização e desserialização.

  • Sob determinadas condições, é possível a serialização e desserialização de coleções genéricas personalizadas.

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

  • Ele suporta serialização e desserialização de hierarquia de tipos polimórficos onde os tipos foram explicitamente aceitos por meio do atributo [JsonDerivedType] ou conversor personalizado. Não há suporte para hierarquias de herança abertas, e o disparo de ida e volta com polimorfismo requer identificadores discriminadores de tipo para todos os tipos derivados conhecidos.

  • O atributo [JsonIgnore] em uma propriedade faz com que a propriedade seja omitida do JSON durante a serialização.

  • Para preservar referências e manipular 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 enquanto minimiza as alterações nos tipos serializados.