Partilhar via


Migrar para DataContractSerializer (XML)

As bibliotecas de classes base do .NET fornecem dois serializadores XML: XmlSerializer e DataContractSerializer. Existem algumas diferenças sutis entre esses dois, mas para fins de migração, esta seção se concentra apenas em DataContractSerializer. Porquê? Porque suporta totalmente o modelo de serialization programação que foi usado pelo BinaryFormatter. Todos os tipos que já estão marcados como [Serializable] ou implementam ISerializable podem ser serializados com DataContractSerializer. Onde está a captura? Os tipos conhecidos devem ser especificados antecipadamente. Você precisa conhecê-los e ser capaz de obter o Type, mesmo para tipos privados.

Não é necessário especificar as coleções mais populares ou tipos primitivos como string ou DateTime (o serializador tem sua própria lista de permissões padrão), mas há exceções como DateTimeOffset. Para obter mais informações sobre os tipos suportados, consulte Tipos suportados pelo serializador de contrato de dados.

A confiança parcial é um recurso do .NET Framework que não foi portado para o .NET (Core). Se seu código é executado no .NET Framework e usa esse recurso, leia sobre as limitações que podem se aplicar a esse cenário.

Migração passo a passo

  1. Encontre todos os usos do BinaryFormatter.
  2. Certifique-se de que os caminhos de serialization código sejam cobertos com testes, para que você possa verificar suas alterações e evitar a introdução de bugs.
  3. Você não precisa instalar nenhum pacote, pois DataContractSerializer faz parte das bibliotecas principais do .NET.
  4. Encontre todos os tipos que estão sendo serializados com BinaryFormattero . Você não precisa modificar nenhum deles, mas pode ser necessário listá-los via knownTypes argumento do DataContractSerializer construtor.
  5. Substitua o uso de BinaryFormatter por DataContractSerializer.
DataContractSerializer serializer = new(
    type: input.GetType(),
    knownTypes: new Type[]
    {
        typeof(MyType1),
        typeof(MyType2)
    });