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 que o idioma e o seguro serialization.

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

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

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

  • Sob certas condições, ele suporta serialization 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 hierarquia serialization de tipo polimórfica e desserialização onde os tipos foram explicitamente aceitos através do [JsonDerivedType] atributo 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 [JsonIgnore] atributo em uma propriedade faz com que a propriedade seja omitida do JSON durante serializationo .

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