Partilhar via


SYSLIB0051: APIs de suporte à serialização herdada estão obsoletas

Os seguintes tipos de APIs são obsoletos, começando no .NET 8. Chamá-los em código gera aviso SYSLIB0051 em tempo de compilação.

Para obter uma lista completa das APIs afetadas, consulte APIs obsoletas - SYSLIB0051.

Solução

  • Se você criou um tipo personalizado derivado do System.Exception, considere se realmente precisa que ele seja serializável. É provável que você não precise que ele seja serializável, já que a serialização de exceção destina-se principalmente a oferecer suporte remoto e o suporte para comunicação remota foi descartado no .NET Core 1.0.

    Se o tipo de exceção personalizada for definido como o mostrado no trecho de código a seguir, basta remover o [Serializable] atributo, o construtor de serialização e a substituição do GetObjectData(SerializationInfo, StreamingContext) método.

    [Serializable] // Remove this attribute.
    public class MyException : Exception
    {
        public MyException() { }
        public MyException(string message) : base(message) { }
        public MyException(string message, Exception inner) : base(message, inner) { }
    
        // Remove this constructor.
        protected MyException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            // ...
        }
    
        // Remove this method.
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            // ...
    
            base.GetObjectData(info, context);
        }
    }
    

    Pode haver casos em que você não possa remover essas APIs do seu tipo de exceção personalizado, por exemplo, se você produzir uma biblioteca restrita por requisitos de compatibilidade de API. Nesse caso, a recomendação é obsoletar seu próprio construtor de serialização e GetObjectData métodos usando o SYSLIB0051 código de diagnóstico, conforme mostrado no código a seguir. Como idealmente ninguém fora da própria infraestrutura de serialização deve chamar essas APIs, a obsolação deve afetar apenas outros tipos que subclassifiquem seu tipo de exceção personalizado. Ele não deve afetar viralmente ninguém capturando, construindo ou usando seu tipo de exceção personalizado.

    [Serializable]
    public class MyException : Exception
    {
        public MyException() { }
        public MyException(string message) : base(message) { }
        public MyException(string message, Exception inner) : base(message, inner) { }
    
        [Obsolete(DiagnosticId = "SYSLIB0051")] // Add this attribute to the serialization ctor.
        protected MyException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            // ...
        }
    
        [Obsolete(DiagnosticId = "SYSLIB0051")] // Add this attribute to GetObjectData.
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            // ...
    
            base.GetObjectData(info, context);
        }
    }
    

    Se você cruzar o destino para .NET Framework e .NET 8+, você pode usar uma #if instrução para aplicar a obsolescência condicionalmente. Essa é a mesma estratégia que a equipe do .NET usa na base de código das bibliotecas do .NET quando os tempos de execução de direcionamento cruzado.

    [Serializable]
    public class MyException : Exception
    {
        // ...
    
    #if NET8_0_OR_GREATER
        [Obsolete(DiagnosticId = "SYSLIB0051")] // add this attribute to the serialization ctor
    #endif
        protected MyException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            // ...
        }
    
    #if NET8_0_OR_GREATER
        [Obsolete(DiagnosticId = "SYSLIB0051")] // add this attribute to GetObjectData
    #endif
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            // ...
    
            base.GetObjectData(info, context);
        }
    }
    
    
  • Se você declarou um tipo que subclassifica um tipo .NET atribuído [Serializable] e está recebendo SYSLIB0051 avisos, siga as orientações para tipos de exceção personalizados no marcador anterior.

Gorjeta

Se o seu [Serializable] tipo personalizado não subclassificar um tipo .NET, você não verá SYSLIB0051 avisos. No entanto, recomendamos não anotar seu tipo dessa maneira, pois as bibliotecas de serialização modernas não System.Text.Json as exigem. Considere remover o [Serializable] atributo e a ISerializable interface. Em vez disso, confie em sua biblioteca de serialização para acessar objetos do tipo por meio de suas propriedades públicas em vez de seus campos privados.

Suprimir um aviso

Se você precisar usar as APIs obsoletas, poderá suprimir o aviso no código ou no arquivo de projeto.

Para suprimir apenas uma única violação, adicione diretivas de pré-processador ao arquivo de origem para desativar e reativar o aviso.

// Disable the warning.
#pragma warning disable SYSLIB0051

// Code that uses obsolete API.
// ...

// Re-enable the warning.
#pragma warning restore SYSLIB0051

Para suprimir todos os SYSLIB0051 avisos em seu projeto, adicione uma <NoWarn> propriedade ao seu arquivo de projeto.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0051</NoWarn>
  </PropertyGroup>
</Project>

Para obter mais informações, consulte Suprimir avisos.

Consulte também