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