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 comotrue
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
, definaJsonSerializerOptions.ReferenceHandler
comoReferenceHandler.Preserve
.Serialization pode ser amplamente personalizado com contratos personalizados, desbloqueando muitos cenários, minimizando as alterações em tipos serializados.