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 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 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 suportados
para detalhes sobre quais tipos e coleções são suportados para 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
, definaJsonSerializerOptions.ReferenceHandler
comoReferenceHandler.Preserve
.Serialization pode ser amplamente personalizado com contratos personalizados, desbloqueando muitos cenários enquanto minimiza as alterações nos tipos serializados.